Beispiel #1
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        md = checkfield(md, 'fieldname', 'constants.g', '>', 0, 'size', [1])
        md = checkfield(md, 'fieldname', 'constants.yts', '>', 0, 'size', [1])
        md = checkfield(md, 'fieldname', 'constants.referencetemperature',
                        'size', [1])

        return md
Beispiel #2
0
    def checkconsistency(self,md,solution,analyses):    # {{{
        md = checkfield(md,'fieldname','amr.level_max','numel',[1],'>=',0,'<=',4)
        md = checkfield(md,'fieldname','amr.region_level_1','numel',[1],'>',0,'NaN',1,'Inf',1)
        md = checkfield(md,'fieldname','amr.region_level_max','numel',[1],'>',0,'NaN',1,'Inf',1)
                #it was adopted 20% of the region_level_1
        if self.region_level_1-self.region_level_max<0.2*self.region_level_1:
            md.checkmessage("region_level_max should be lower than 80% of region_level_1")

        return md
Beispiel #3
0
	def checkconsistency(self,md,solution,analyses):    # {{{

		#Early return
		if (solution!='TransientSolution') or (not md.transient.ismovingfront):
			return md

		md = checkfield(md,'fieldname','calving.coeff','size',[md.mesh.numberofvertices],'>',0)
		md = checkfield(md,'fieldname','calving.meltingrate','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices],'>=',0)
		return md
Beispiel #4
0
	def checkconsistency(self,md,solution,analyses):    # {{{
		#Early return
		if not solution=='BalancethicknessSolution':
			return md

		md = checkfield(md,'fieldname','balancethickness.spcthickness')
		md = checkfield(md,'fieldname','balancethickness.thickening_rate','size',[md.mesh.numberofvertices],'NaN',1,'Inf',1)
		md = checkfield(md,'fieldname','balancethickness.stabilization','size',[1],'values',[0,1,2,3])

		return md
Beispiel #5
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        #Early return
        if 'StressbalanceAnalysis' not in analyses and 'ThermalAnalysis' not in analyses:
            return md

        md = checkfield(md, 'fieldname', 'friction.C', 'timeseries', 1, 'NaN',
                        1, 'Inf', 1)
        md = checkfield(md, 'fieldname', 'friction.m', 'NaN', 1, 'Inf', 1,
                        'size', [md.mesh.numberofelements])

        return md
Beispiel #6
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        #Early return
        if (solution !=
                'TransientSolution') or (not md.transient.ismovingfront):
            return md

        md = checkfield(md, 'fieldname', 'calving.calvingrate', '>=', 0,
                        'timeseries', 1, 'NaN', 1, 'Inf', 1)
        md = checkfield(md, 'fieldname', 'calving.meltingrate', '>=', 0,
                        'timeseries', 1, 'NaN', 1, 'Inf', 1)

        return md
Beispiel #7
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        if 'MasstransportAnalysis' in analyses:
            md = checkfield(md, 'fieldname', 'smb.mass_balance', 'timeseries',
                            1, 'NaN', 1, 'Inf', 1)

        if 'BalancethicknessAnalysis' in analyses:
            md = checkfield(md, 'fieldname', 'smb.mass_balance', 'size',
                            [md.mesh.numberofvertices], 'NaN', 1, 'Inf', 1)

        md = checkfield(md, 'fieldname', 'masstransport.requested_outputs',
                        'stringrow', 1)
        return md
Beispiel #8
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        #Early return
        if (solution !=
                'TransientSolution') or (not md.transient.ismovingfront):
            return md

        md = checkfield(md, 'fieldname', 'levelset.spclevelset', 'Inf', 1,
                        'timeseries', 1)
        md = checkfield(md, 'fieldname', 'levelset.stabilization', 'values',
                        [0, 1, 2])
        md = checkfield(md, 'fieldname', 'levelset.calving_max', 'NaN', 1,
                        'Inf', 1, '>', 0)

        return md
Beispiel #9
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        if 'MasstransportAnalysis' in analyses:
            md = checkfield(md, 'fieldname', 'smb.href', 'timeseries', 1,
                            'NaN', 1, 'Inf', 1)
            md = checkfield(md, 'fieldname', 'smb.smbref', 'timeseries', 1,
                            'NaN', 1, 'Inf', 1)
            md = checkfield(md, 'fieldname', 'smb.b_pos', 'timeseries', 1,
                            'NaN', 1, 'Inf', 1)
            md = checkfield(md, 'fieldname', 'smb.b_neg', 'timeseries', 1,
                            'NaN', 1, 'Inf', 1)

        md = checkfield(md, 'fieldname', 'masstransport.requested_outputs',
                        'stringrow', 1)
        return md
Beispiel #10
0
    def checkconsistency(self, md, i, solution, analyses, driver):  # {{{
        if not np.isnan(self.fos_forward_index):
            if not strcmpi(driver, 'fos_forward'):
                raise TypeError(
                    "cannot declare an independent with a fos_forward_index when the driver is not fos_forward!"
                )
            if self.nods == 0:
                raise TypeError(
                    "independent checkconsistency error: nods should be set to the size of the independent variable"
                )

        if len(self.fov_forward_indices) > 0:
            if not strcmpi(driver, 'fov_forward'):
                raise TypeError(
                    "cannot declare an independent with fov_forward_indices when the driver is not fov_forward!"
                )
            if self.nods == 0:
                raise TypeError(
                    "independent checkconsistency error: nods should be set to the size of the independent variable"
                )
            md = checkfield(
                md, 'fieldname',
                "autodiff.independents[%d].fov_forward_indices" % i, '>=', 1,
                '<=', self.nods)

        return md
Beispiel #11
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        if not isinstance(self.name, basestring):
            raise RuntimeError(
                "massfluxatgate error message: 'name' field should be a string!"
            )

        if not isinstance(self.profilename, basestring):
            raise RuntimeError(
                "massfluxatgate error message: 'profilename' field should be a string!"
            )

            md = checkfield(md, 'field', self.definitionstring, 'values', [
                'Outputdefinition1', 'Outputdefinition2', 'Outputdefinition3',
                'Outputdefinition4', 'Outputdefinition5', 'Outputdefinition6',
                'Outputdefinition7', 'Outputdefinition8', 'Outputdefinition9',
                'Outputdefinition10'
            ])

        #check the profilename points to a file!:
        if not os.path.isfile(self.profilename):
            raise RuntimeError(
                "massfluxatgate error message: file name for profile corresponding to gate does not point to a legitimate file on disk!"
            )

        return md
Beispiel #12
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        # Early return
        if ('GiaAnalysis' not in analyses):
            return md

        md = checkfield(md, 'fieldname', 'gia.mantle_viscosity', 'NaN', 1,
                        'Inf', 1, 'size', [md.mesh.numberofvertices], '>', 0)
        md = checkfield(md, 'fieldname', 'gia.lithosphere_thickness', 'NaN', 1,
                        'Inf', 1, 'size', [md.mesh.numberofvertices], '>', 0)
        md = checkfield(md, 'fieldname', 'gia.cross_section_shape', 'numel',
                        [1], 'values', [1, 2])

        #be sure that if we are running a masstransport ice flow model coupled with giaivins, that thickness forcings
        #are not provided into the future.

        return md
Beispiel #13
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        #Early return
        if not self.isautodiff:
            return md

        md = checkfield(md, 'fieldname', 'autodiff.obufsize', '>=', 524288)
        md = checkfield(md, 'fieldname', 'autodiff.lbufsize', '>=', 524288)
        md = checkfield(md, 'fieldname', 'autodiff.cbufsize', '>=', 524288)
        md = checkfield(md, 'fieldname', 'autodiff.tbufsize', '>=', 524288)
        md = checkfield(md, 'fieldname', 'autodiff.gcTriggerRatio', '>=', 2.0)
        md = checkfield(md, 'fieldname', 'autodiff.gcTriggerMaxSize', '>=',
                        65536)

        #Driver value:
        md = checkfield(md, 'fieldname', 'autodiff.driver', 'values', [
            'fos_forward', 'fov_forward', 'fov_forward_all', 'fos_reverse',
            'fov_reverse', 'fov_reverse_all'
        ])

        #go through our dependents and independents and check consistency:
        for dep in self.dependents:
            dep.checkconsistency(md, solution, analyses)
        for i, indep in enumerate(self.independents):
            indep.checkconsistency(md, i, solution, analyses, self.driver)

        return md
Beispiel #14
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        if 'MasstransportAnalysis' in analyses and not (
                solution == 'TransientSolution'
                and not md.transient.ismasstransport):
            md = checkfield(md, 'fieldname',
                            'basalforcings.groundedice_melting_rate', 'NaN', 1,
                            'Inf', 1, 'timeseries', 1)
            md = checkfield(md, 'fieldname',
                            'basalforcings.floatingice_melting_rate', 'NaN', 1,
                            'Inf', 1, 'timeseries', 1)

        if 'BalancethicknessAnalysis' in analyses:
            md = checkfield(md, 'fieldname',
                            'basalforcings.groundedice_melting_rate', 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname',
                            'basalforcings.floatingice_melting_rate', 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])

        if 'ThermalAnalysis' in analyses and not (
                solution == 'TransientSolution'
                and not md.transient.isthermal):
            md = checkfield(md, 'fieldname',
                            'basalforcings.groundedice_melting_rate', 'NaN', 1,
                            'Inf', 1, 'timeseries', 1)
            md = checkfield(md, 'fieldname',
                            'basalforcings.floatingice_melting_rate', 'NaN', 1,
                            'Inf', 1, 'timeseries', 1)
            md = checkfield(md, 'fieldname', 'basalforcings.geothermalflux',
                            'NaN', 1, 'Inf', 1, 'timeseries', 1, '>=', 0)

        return md
Beispiel #15
0
	def checkconsistency(self,md,solution,analyses): # {{{
		md = checkfield(md,'fieldname','mask.groundedice_levelset','size',[md.mesh.numberofvertices])
		md = checkfield(md,'fieldname','mask.ice_levelset'        ,'size',[md.mesh.numberofvertices])
		md = checkfield(md,'fieldname','mask.ocean_levelset','size',[md.mesh.numberofvertices])
		md = checkfield(md,'fieldname','mask.land_levelset','size',[md.mesh.numberofvertices])
		isice=(md.mask.ice_levelset<=0)
		if sum(isice)==0:
			print('no ice present in the domain')

		if max(md.mask.ice_levelset)<0:
			print('no ice front provided')

		elements=md.mesh.elements-1; elements=elements.astype(np.int32, copy=False);
		icefront=np.sum(md.mask.ice_levelset[elements]==0,axis=1)
		if (max(icefront)==3 & m.strcmp(md.mesh.elementtype(),'Tria')) or (max(icefront==6) & m.strcmp(md.mesh.elementtype(),'Penta')):
			raise RuntimeError('At least one element has all nodes on ice front, change md.mask.ice_levelset to fix it')

		return md
Beispiel #16
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        md = checkfield(md, 'fieldname', 'mask.ice_levelset', 'size',
                        [md.mesh.numberofvertices])
        isice = np.array(md.mask.ice_levelset <= 0, int)
        if np.sum(isice) == 0:
            raise TypeError("no ice present in the domain")

        return md
Beispiel #17
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        #Early return
        if (solution != 'EsaAnalysis'):
            return md

        md = checkfield(md, 'fieldname', 'esa.deltathickness', 'NaN', 1, 'Inf',
                        1, 'size', [md.mesh.numberofelements, 1])
        md = checkfield(md, 'fieldname', 'esa.love_h', 'NaN', 1, 'Inf', 1)
        md = checkfield(md, 'fieldname', 'esa.love_l', 'NaN', 1, 'Inf', 1)
        md = checkfield(md, 'fieldname', 'esa.degacc', 'size', [1, 1], '>=',
                        1e-10)
        md = checkfield(md, 'fieldname', 'esa.requested_outputs', 'stringrow',
                        1)

        #check that love numbers are provided at the same level of accuracy:
        if (size(self.love_h, 0) != size(self.love_l, 0)):
            error(
                'esa error message: love numbers should be provided at the same level of accuracy'
            )
        return md
Beispiel #18
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        #Early return
        if ('MasstransportAnalysis'
                not in analyses) or (solution == 'TransientSolution'
                                     and not md.transient.ismasstransport):
            return md

        md = checkfield(md, 'fieldname', 'masstransport.spcthickness', 'Inf',
                        1, 'timeseries', 1)
        md = checkfield(md, 'fieldname', 'masstransport.isfreesurface',
                        'values', [0, 1])
        md = checkfield(md, 'fieldname',
                        'masstransport.hydrostatic_adjustment', 'values',
                        ['Absolute', 'Incremental'])
        md = checkfield(md, 'fieldname', 'masstransport.stabilization',
                        'values', [0, 1, 2, 3, 4])
        md = checkfield(md, 'fieldname', 'masstransport.min_thickness', '>', 0)
        md = checkfield(md, 'fieldname', 'masstransport.requested_outputs',
                        'stringrow', 1)

        return md
Beispiel #19
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        #Early return
        if ('StressbalanceAnalysis' not in analyses
                and 'StressbalanceSIAAnalysis'
                not in analyses) or (solution == 'TransientSolution'
                                     and not md.transient.isstressbalance):
            return md

        md = checkfield(md, 'fieldname', 'flowequation.isSIA', 'numel', [1],
                        'values', [0, 1])
        md = checkfield(md, 'fieldname', 'flowequation.isSSA', 'numel', [1],
                        'values', [0, 1])
        md = checkfield(md, 'fieldname', 'flowequation.isL1L2', 'numel', [1],
                        'values', [0, 1])
        md = checkfield(md, 'fieldname', 'flowequation.isHO', 'numel', [1],
                        'values', [0, 1])
        md = checkfield(md, 'fieldname', 'flowequation.isFS', 'numel', [1],
                        'values', [0, 1])
        md = checkfield(
            md, 'fieldname', 'flowequation.fe_SSA', 'values',
            ['P1', 'P1bubble', 'P1bubblecondensed', 'P2', 'P2bubble'])
        md = checkfield(md, 'fieldname', 'flowequation.fe_HO', 'values', [
            'P1', 'P1bubble', 'P1bubblecondensed', 'P1xP2', 'P2xP1', 'P2',
            'P2bubble', 'P1xP3', 'P2xP4'
        ])
        md = checkfield(md, 'fieldname', 'flowequation.fe_FS', 'values', [
            'P1P1', 'P1P1GLS', 'MINIcondensed', 'MINI', 'TaylorHood',
            'XTaylorHood', 'OneLayerP4z', 'CrouzeixRaviart'
        ])
        md = checkfield(md, 'fieldname', 'flowequation.borderSSA', 'size',
                        [md.mesh.numberofvertices], 'values', [0, 1])
        md = checkfield(md, 'fieldname', 'flowequation.borderHO', 'size',
                        [md.mesh.numberofvertices], 'values', [0, 1])
        md = checkfield(md, 'fieldname', 'flowequation.borderFS', 'size',
                        [md.mesh.numberofvertices], 'values', [0, 1])
        md = checkfield(md, 'fieldname', 'flowequation.augmented_lagrangian_r',
                        'numel', [1], '>', 0.)
        md = checkfield(md, 'fieldname',
                        'flowequation.augmented_lagrangian_rhop', 'numel', [1],
                        '>', 0.)
        md = checkfield(md, 'fieldname',
                        'flowequation.augmented_lagrangian_rlambda', 'numel',
                        [1], '>', 0.)
        md = checkfield(md, 'fieldname',
                        'flowequation.augmented_lagrangian_rholambda', 'numel',
                        [1], '>', 0.)
        md = checkfield(md, 'fieldname', 'flowequation.XTH_theta', 'numel',
                        [1], '>=', 0., '<', .5)
        if m.strcmp(md.mesh.domaintype(), '2Dhorizontal'):
            md = checkfield(md, 'fieldname', 'flowequation.vertex_equation',
                            'size', [md.mesh.numberofvertices], 'values',
                            [1, 2])
            md = checkfield(md, 'fieldname', 'flowequation.element_equation',
                            'size', [md.mesh.numberofelements], 'values',
                            [1, 2])
        elif m.strcmp(md.mesh.domaintype(), '3D'):
            md = checkfield(md, 'fieldname', 'flowequation.vertex_equation',
                            'size', [md.mesh.numberofvertices], 'values',
                            np.arange(0, 8 + 1))
            md = checkfield(md, 'fieldname', 'flowequation.element_equation',
                            'size', [md.mesh.numberofelements], 'values',
                            np.arange(0, 8 + 1))
        else:
            raise RuntimeError('mesh type not supported yet')
        if not (self.isSIA or self.isSSA or self.isL1L2 or self.isHO
                or self.isFS):
            md.checkmessage("no element types set for this model")

        if 'StressbalanceSIAAnalysis' in analyses:
            if any(self.element_equation == 1):
                if np.any(
                        np.logical_and(self.vertex_equation,
                                       md.mask.groundedice_levelset)):
                    print "\n !!! Warning: SIA's model is not consistent on ice shelves !!!\n"

        return md
Beispiel #20
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        #Early return
        if not self.iscontrol:
            return md

        num_controls = np.size(md.inversion.control_parameters)
        num_costfunc = np.size(md.inversion.cost_functions)

        md = checkfield(md, 'fieldname', 'inversion.iscontrol', 'values',
                        [0, 1])
        md = checkfield(md, 'fieldname', 'inversion.incomplete_adjoint',
                        'values', [0, 1])
        md = checkfield(md, 'fieldname', 'inversion.control_parameters',
                        'cell', 1, 'values', supportedcontrols())
        md = checkfield(md, 'fieldname', 'inversion.control_scaling_factors',
                        'size', [num_controls], '>', 0, 'NaN', 1, 'Inf', 1)
        md = checkfield(md, 'fieldname', 'inversion.maxsteps', 'numel', [1],
                        '>=', 0)
        md = checkfield(md, 'fieldname', 'inversion.maxiter', 'numel', [1],
                        '>=', 0)
        md = checkfield(md, 'fieldname', 'inversion.dxmin', 'numel', [1], '>',
                        0.)
        md = checkfield(md, 'fieldname', 'inversion.gttol', 'numel', [1], '>',
                        0.)
        md = checkfield(md, 'fieldname', 'inversion.cost_functions', 'size',
                        [num_costfunc], 'values', supportedcostfunctions())
        md = checkfield(md, 'fieldname',
                        'inversion.cost_functions_coefficients', 'size',
                        [md.mesh.numberofvertices, num_costfunc], '>=', 0)
        md = checkfield(md, 'fieldname', 'inversion.min_parameters', 'size',
                        [md.mesh.numberofvertices, num_controls])
        md = checkfield(md, 'fieldname', 'inversion.max_parameters', 'size',
                        [md.mesh.numberofvertices, num_controls])

        if solution == 'BalancethicknessSolution':
            md = checkfield(md, 'fieldname', 'inversion.thickness_obs', 'size',
                            [md.mesh.numberofvertices], 'NaN', 1, 'Inf', 1)
        else:
            md = checkfield(md, 'fieldname', 'inversion.vx_obs', 'size',
                            [md.mesh.numberofvertices], 'NaN', 1, 'Inf', 1)
            md = checkfield(md, 'fieldname', 'inversion.vy_obs', 'size',
                            [md.mesh.numberofvertices], 'NaN', 1, 'Inf', 1)

        return md
Beispiel #21
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        md = checkfield(md, 'fieldname', 'damage.isdamage', 'numel', [1],
                        'values', [0, 1])
        if self.isdamage:
            md = checkfield(md, 'fieldname', 'damage.D', '>=', 0, '<=',
                            self.max_damage, 'size',
                            [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname', 'damage.max_damage', '<', 1, '>=',
                            0)
            md = checkfield(md, 'fieldname', 'damage.law', 'numel', [1],
                            'values', [0, 1, 2, 3])
            md = checkfield(md, 'fieldname', 'damage.spcdamage', 'Inf', 1,
                            'timeseries', 1)
            md = checkfield(md, 'fieldname', 'damage.stabilization', 'numel',
                            [1], 'values', [0, 1, 2, 4])
            md = checkfield(md, 'fieldname', 'damage.maxiter', '>=0', 0)
            md = checkfield(md, 'fieldname', 'damage.elementinterp', 'values',
                            ['P1', 'P2'])
            md = checkfield(md, 'fieldname', 'damage.stress_threshold', '>=',
                            0)
            md = checkfield(md, 'fieldname', 'damage.kappa', '>', 1)
            md = checkfield(md, 'fieldname', 'damage.healing', '>=', 0)
            md = checkfield(md, 'fieldname', 'damage.c1', '>=', 0)
            md = checkfield(md, 'fieldname', 'damage.c2', '>=', 0)
            md = checkfield(md, 'fieldname', 'damage.c3', '>=', 0)
            md = checkfield(md, 'fieldname', 'damage.c4', '>=', 0)
            md = checkfield(md, 'fieldname', 'damage.healing', '>=', 0)
            md = checkfield(md, 'fieldname', 'damage.equiv_stress', 'numel',
                            [1], 'values', [0, 1])
            md = checkfield(md, 'fieldname', 'damage.requested_outputs',
                            'stringrow', 1)
        elif self.law != 0:
            if (solution == 'DamageEvolutionSolution'):
                raise RuntimeError(
                    'Invalid evolution law (md.damage.law) for a damage solution'
                )

        return md
Beispiel #22
0
    def checkconsistency(self, md, solution, analyses):  # {{{
        if 'StressbalanceAnalysis' in analyses:
            if not np.any(
                    np.logical_or(np.isnan(md.initialization.vx),
                                  np.isnan(md.initialization.vy))):
                md = checkfield(md, 'fieldname', 'initialization.vx', 'NaN', 1,
                                'Inf', 1, 'size', [md.mesh.numberofvertices])
                md = checkfield(md, 'fieldname', 'initialization.vy', 'NaN', 1,
                                'Inf', 1, 'size', [md.mesh.numberofvertices])
        if 'MasstransportAnalysis' in analyses:
            md = checkfield(md, 'fieldname', 'initialization.vx', 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname', 'initialization.vy', 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
        if 'BalancethicknessAnalysis' in analyses:
            md = checkfield(md, 'fieldname', 'initialization.vx', 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname', 'initialization.vy', 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
            #Triangle with zero velocity
            if np.any(np.logical_and(np.sum(np.abs(md.initialization.vx[md.mesh.elements-1]),axis=1)==0,\
                                           np.sum(np.abs(md.initialization.vy[md.mesh.elements-1]),axis=1)==0)):
                md.checkmessage(
                    "at least one triangle has all its vertices with a zero velocity"
                )
        if 'ThermalAnalysis' in analyses:
            md = checkfield(md, 'fieldname', 'initialization.vx', 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname', 'initialization.vy', 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname', 'initialization.temperature',
                            'NaN', 1, 'Inf', 1, 'size',
                            [md.mesh.numberofvertices])
            if md.mesh.dimension() == 3:
                md = checkfield(md, 'fieldname', 'initialization.vz', 'NaN', 1,
                                'Inf', 1, 'size', [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname', 'initialization.pressure', 'NaN',
                            1, 'Inf', 1, 'size', [md.mesh.numberofvertices])
            if ('EnthalpyAnalysis' in analyses and md.thermal.isenthalpy):
                md = checkfield(md, 'fieldname',
                                'initialization.waterfraction', '>=', 0,
                                'size', [md.mesh.numberofvertices])
                md = checkfield(md, 'fieldname', 'initialization.watercolumn',
                                '>=', 0, 'size', [md.mesh.numberofvertices])
                pos = np.nonzero(md.initialization.waterfraction > 0.)[0]
                if (pos.size):
                    md = checkfield(
                        md, 'fieldname', 'delta Tpmp', 'field',
                        np.absolute(md.initialization.temperature[pos] -
                                    (md.materials.meltingpoint -
                                     md.materials.beta *
                                     md.initialization.pressure[pos])), '<',
                        1e-11, 'message',
                        'set temperature to pressure melting point at locations with waterfraction>0'
                    )
        if 'HydrologyShreveAnalysis' in analyses:
            if hasattr(md.hydrology, 'hydrologyshreve'):
                md = checkfield(md, 'fieldname', 'initialization.watercolumn',
                                'NaN', 1, 'Inf', 1, 'size',
                                [md.mesh.numberofvertices])
        if 'HydrologyDCInefficientAnalysis' in analyses:
            if hasattr(md.hydrology, 'hydrologydc'):
                md = checkfield(md, 'fieldname',
                                'initialization.sediment_head', 'NaN', 1,
                                'Inf', 1, 'size', [md.mesh.numberofvertices])
        if 'HydrologyDCEfficientAnalysis' in analyses:
            if hasattr(md.hydrology, 'hydrologydc'):
                if md.hydrology.isefficientlayer == 1:
                    md = checkfield(md, 'fieldname', 'initialization.epl_head',
                                    'NaN', 1, 'Inf', 1, 'size',
                                    [md.mesh.numberofvertices])
                    md = checkfield(md, 'fieldname',
                                    'initialization.epl_thickness', 'NaN', 1,
                                    'Inf', 1, 'size',
                                    [md.mesh.numberofvertices])

        return md
Beispiel #23
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        if 'MasstransportAnalysis' in analyses:
            md = checkfield(md, 'fieldname', 'smb.desfac', '<=', 1, 'numel',
                            [1])
            md = checkfield(md, 'fieldname', 'smb.s0p', '>=', 0, 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname', 'smb.s0t', '>=', 0, 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname', 'smb.rlaps', '>=', 0, 'numel',
                            [1])
            md = checkfield(md, 'fieldname', 'smb.rlapslgm', '>=', 0, 'numel',
                            [1])

            if (self.isdelta18o == 0 and self.ismungsm == 0):
                md = checkfield(md, 'fieldname', 'smb.monthlytemperatures',
                                'NaN', 1, 'Inf', 1, 'timeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.precipitation', 'NaN', 1,
                                'Inf', 1, 'timeseries', 1)
            elif self.isdelta18o:
                md = checkfield(md, 'fieldname', 'smb.delta18o', 'NaN', 1,
                                'Inf', 1, 'size', [2, np.nan],
                                'singletimeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.delta18o_surface', 'NaN',
                                1, 'Inf', 1, 'size', [2, np.nan],
                                'singletimeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.temperatures_presentday',
                                'size', [md.mesh.numberofvertices + 1, 12],
                                'NaN', 1, 'Inf', 1, 'timeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.temperatures_lgm',
                                'size', [md.mesh.numberofvertices + 1, 12],
                                'NaN', 1, 'Inf', 1, 'timeseries', 1)
                md = checkfield(md, 'fieldname',
                                'smb.precipitations_presentday', 'size',
                                [md.mesh.numberofvertices + 1, 12], 'NaN', 1,
                                'Inf', 1, 'timeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.precipitations_lgm',
                                'size', [md.mesh.numberofvertices + 1, 12],
                                'NaN', 1, 'Inf', 1, 'timeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.Tdiff', 'NaN', 1, 'Inf',
                                1, 'size', [2, np.nan], 'singletimeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.sealev', 'NaN', 1, 'Inf',
                                1, 'size', [2, np.nan], 'singletimeseries', 1)
            elif self.ismungsm:
                md = checkfield(md, 'fieldname', 'smb.temperatures_presentday',
                                'size', [md.mesh.numberofvertices + 1, 12],
                                'NaN', 1, 'Inf', 1, 'timeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.temperatures_lgm',
                                'size', [md.mesh.numberofvertices + 1, 12],
                                'NaN', 1, 'Inf', 1, 'timeseries', 1)
                md = checkfield(md, 'fieldname',
                                'smb.precipitations_presentday', 'size',
                                [md.mesh.numberofvertices + 1, 12], 'NaN', 1,
                                'Inf', 1, 'timeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.precipitations_lgm',
                                'size', [md.mesh.numberofvertices + 1, 12],
                                'NaN', 1, 'Inf', 1, 'timeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.Pfac', 'NaN', 1, 'Inf',
                                1, 'size', [2, np.nan], 'singletimeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.Tdiff', 'NaN', 1, 'Inf',
                                1, 'size', [2, np.nan], 'singletimeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.sealev', 'NaN', 1, 'Inf',
                                1, 'size', [2, np.nan], 'singletimeseries', 1)

        md = checkfield(md, 'fieldname', 'masstransport.requested_outputs',
                        'stringrow', 1)
        return md
Beispiel #24
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        md = checkfield(md, 'fieldname', 'mesh.x', 'NaN', 1, 'Inf', 1, 'size',
                        [md.mesh.numberofvertices])
        md = checkfield(md, 'fieldname', 'mesh.y', 'NaN', 1, 'Inf', 1, 'size',
                        [md.mesh.numberofvertices])
        md = checkfield(md, 'fieldname', 'mesh.z', 'NaN', 1, 'Inf', 1, 'size',
                        [md.mesh.numberofvertices])
        md = checkfield(md, 'fieldname', 'mesh.lat', 'NaN', 1, 'Inf', 1,
                        'size', [md.mesh.numberofvertices])
        md = checkfield(md, 'fieldname', 'mesh.long', 'NaN', 1, 'Inf', 1,
                        'size', [md.mesh.numberofvertices])
        md = checkfield(md, 'fieldname', 'mesh.r', 'NaN', 1, 'Inf', 1, 'size',
                        [md.mesh.numberofvertices])
        md = checkfield(md, 'fieldname', 'mesh.elements', 'NaN', 1, 'Inf', 1,
                        '>', 0, 'values',
                        np.arange(1, md.mesh.numberofvertices + 1))
        md = checkfield(md, 'fieldname', 'mesh.elements', 'size',
                        [md.mesh.numberofelements, 3])
        if np.any(
                np.logical_not(
                    np.in1d(np.arange(1, md.mesh.numberofvertices + 1),
                            md.mesh.elements.flat))):
            md = checkmessage(
                md, 'orphan nodes have been found. Check the mesh outline')

        md = checkfield(md, 'fieldname', 'mesh.numberofelements', '>', 0)
        md = checkfield(md, 'fieldname', 'mesh.numberofvertices', '>', 0)
        md = checkfield(
            md, 'fieldname', 'mesh.average_vertex_connectivity', '>=', 9,
            'message',
            '"mesh.average_vertex_connectivity" should be at least 9 in 2d')

        if (solution == 'ThermalSolution'):
            md = checkmessage(md, 'thermal not supported for 2d mesh')

        return md
Beispiel #25
0
    def checkconsistency(self, md, solution, analyses):  # {{{
        md = checkfield(md, 'fieldname', 'materials.rho_ice', '>', 0)
        md = checkfield(md, 'fieldname', 'materials.rho_water', '>', 0)
        md = checkfield(md, 'fieldname', 'materials.rho_freshwater', '>', 0)
        md = checkfield(md, 'fieldname', 'materials.mu_water', '>', 0)
        md = checkfield(md, 'fieldname', 'materials.rheology_B', '>', 0,
                        'timeseries', 1, 'NaN', 1, 'Inf', 1)
        md = checkfield(md, 'fieldname', 'materials.rheology_n', '>', 0,
                        'size', [md.mesh.numberofelements])
        md = checkfield(md, 'fieldname', 'materials.rheology_law', 'values', [
            'None', 'BuddJacka', 'Cuffey', 'CuffeyTemperate', 'Paterson',
            'Arrhenius', 'LliboutryDuval'
        ])
        md = checkfield(md, 'fieldname', 'materials.lithosphere_shear_modulus',
                        '>', 0, 'numel', [1])
        md = checkfield(md, 'fieldname', 'materials.lithosphere_density', '>',
                        0, 'numel', [1])
        md = checkfield(md, 'fieldname', 'materials.mantle_shear_modulus', '>',
                        0, 'numel', [1])
        md = checkfield(md, 'fieldname', 'materials.mantle_density', '>', 0,
                        'numel', [1])
        md = checkfield(md, 'fieldname', 'materials.earth_density', '>', 0,
                        'numel', [1])

        return md
Beispiel #26
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        if 'MasstransportAnalysis' in analyses:
            md = checkfield(md, 'fieldname', 'smb.desfac', '<=', 1, 'numel',
                            [1])
            md = checkfield(md, 'fieldname', 'smb.s0p', '>=', 0, 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname', 'smb.s0t', '>=', 0, 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname', 'smb.rlaps', '>=', 0, 'numel',
                            [1])
            md = checkfield(md, 'fieldname', 'smb.rlapslgm', '>=', 0, 'numel',
                            [1])

            if self.isd18opd:
                md = checkfield(md, 'fieldname', 'smb.temperatures_presentday',
                                'size', [md.mesh.numberofvertices + 1, 12],
                                'NaN', 1, 'Inf', 1, 'timeseries', 1)
                md = checkfield(md, 'fieldname',
                                'smb.precipitations_presentday', 'size',
                                [md.mesh.numberofvertices + 1, 12], 'NaN', 1,
                                'Inf', 1, 'timeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.delta18o', 'NaN', 1,
                                'Inf', 1, 'size', [2, np.nan],
                                'singletimeseries', 1)
                md = checkfield(md, 'fieldname', 'smb.dpermil', '>=', 0,
                                'numel', [1])
                md = checkfield(md, 'fieldname', 'smb.f', '>=', 0, 'numel',
                                [1])

        md = checkfield(md, 'fieldname', 'masstransport.requested_outputs',
                        'stringrow', 1)

        return md
Beispiel #27
0
    def checkconsistency(self, md, solution, analyses):  # {{{

        #Early return
        if not self.iscontrol:
            return md

        num_controls = np.size(md.inversion.control_parameters)
        num_costfunc = np.size(md.inversion.cost_functions)

        md = checkfield(md, 'fieldname', 'inversion.iscontrol', 'values',
                        [0, 1])
        md = checkfield(md, 'fieldname', 'inversion.incomplete_adjoint',
                        'values', [0, 1])
        md = checkfield(md, 'fieldname', 'inversion.control_parameters',
                        'cell', 1, 'values', supportedcontrols())
        md = checkfield(md, 'fieldname', 'inversion.nsteps', 'numel', [1],
                        '>=', 0)
        md = checkfield(md, 'fieldname', 'inversion.maxiter_per_step', 'size',
                        [md.inversion.nsteps], '>=', 0)
        md = checkfield(md, 'fieldname', 'inversion.step_threshold', 'size',
                        [md.inversion.nsteps])
        md = checkfield(md, 'fieldname', 'inversion.cost_functions', 'size',
                        [num_costfunc], 'values', supportedcostfunctions())
        md = checkfield(md, 'fieldname',
                        'inversion.cost_functions_coefficients', 'size',
                        [md.mesh.numberofvertices, num_costfunc], '>=', 0)
        md = checkfield(md, 'fieldname', 'inversion.gradient_scaling', 'size',
                        [md.inversion.nsteps, num_controls])
        md = checkfield(md, 'fieldname', 'inversion.min_parameters', 'size',
                        [md.mesh.numberofvertices, num_controls])
        md = checkfield(md, 'fieldname', 'inversion.max_parameters', 'size',
                        [md.mesh.numberofvertices, num_controls])

        #Only SSA, HO and FS are supported right now
        if solution == 'StressbalanceSolution':
            if not (md.flowequation.isSSA or md.flowequation.isHO
                    or md.flowequation.isFS or md.flowequation.isL1L2):
                md.checkmessage(
                    "'inversion can only be performed for SSA, HO or FS ice flow models"
                )

        if solution == 'BalancethicknessSolution':
            md = checkfield(md, 'fieldname', 'inversion.thickness_obs', 'size',
                            [md.mesh.numberofvertices], 'NaN', 1, 'Inf', 1)
        else:
            md = checkfield(md, 'fieldname', 'inversion.vx_obs', 'size',
                            [md.mesh.numberofvertices], 'NaN', 1, 'Inf', 1)
            md = checkfield(md, 'fieldname', 'inversion.vy_obs', 'size',
                            [md.mesh.numberofvertices], 'NaN', 1, 'Inf', 1)

        return md
    def checkconsistency(self, md, solution, analyses):  # {{{

        #Early return
        if 'MasstransportAnalysis' in analyses and not (
                solution == 'TransientSolution'
                and md.transient.ismasstransport == 0):

            md = checkfield(md, 'fieldname',
                            'basalforcings.groundedice_melting_rate', 'NaN', 1,
                            'Inf', 1, 'timeseries', 1)
            md = checkfield(md, 'fieldname', 'basalforcings.meltrate_factor',
                            '>=', 0, 'numel', [1])
            md = checkfield(md, 'fieldname',
                            'basalforcings.threshold_thickness', '>=', 0,
                            'numel', [1])
            md = checkfield(md, 'fieldname', 'basalforcings.upperdepth_melt',
                            '<=', 0, 'numel', [1])

        if 'BalancethicknessAnalysis' in analyses:

            md = checkfield(md, 'fieldname',
                            'basalforcings.groundedice_melting_rate', 'NaN', 1,
                            'Inf', 1, 'size', [md.mesh.numberofvertices])
            md = checkfield(md, 'fieldname', 'basalforcings.meltrate_factor',
                            '>=', 0, 'numel', [1])
            md = checkfield(md, 'fieldname',
                            'basalforcings.threshold_thickness', '>=', 0,
                            'numel', [1])
            md = checkfield(md, 'fieldname', 'basalforcings.upperdepth_melt',
                            '<=', 0, 'numel', [1])

        if 'ThermalAnalysis' in analyses and not (
                solution == 'TransientSolution'
                and md.transient.isthermal == 0):

            md = checkfield(md, 'fieldname',
                            'basalforcings.groundedice_melting_rate', 'NaN', 1,
                            'Inf', 1, 'timeseries', 1)
            md = checkfield(md, 'fieldname', 'basalforcings.meltrate_factor',
                            '>=', 0, 'numel', [1])
            md = checkfield(md, 'fieldname',
                            'basalforcings.threshold_thickness', '>=', 0,
                            'numel', [1])
            md = checkfield(md, 'fieldname', 'basalforcings.upperdepth_melt',
                            '<=', 0, 'numel', [1])
            md = checkfield(md, 'fieldname', 'basalforcings.geothermalflux',
                            'NaN', 1, 'Inf', 1, 'timeseries', 1, '>=', 0)
        return md
Beispiel #29
0
	def checkconsistency(self,md,solution,analyses): #{{{ 

		#Early return
		if 'HydrologyDCInefficientAnalysis' not in analyses and 'HydrologyDCEfficientAnalysis' not in analyses:
			return md

		md = checkfield(md,'fieldname','hydrology.water_compressibility','numel',[1],'>',0.)
		md = checkfield(md,'fieldname','hydrology.isefficientlayer','numel',[1],'values',[0,1])
		md = checkfield(md,'fieldname','hydrology.penalty_factor','>',0.,'numel',[1])
		md = checkfield(md,'fieldname','hydrology.penalty_lock','>=',0.,'numel',[1])
		md = checkfield(md,'fieldname','hydrology.rel_tol','>',0.,'numel',[1])
		md = checkfield(md,'fieldname','hydrology.max_iter','>',0.,'numel',[1])
		md = checkfield(md,'fieldname','hydrology.sedimentlimit_flag','numel',[1],'values',[0,1,2,3])
		md = checkfield(md,'fieldname','hydrology.transfer_flag','numel',[1],'values',[0,1])

		if self.sedimentlimit_flag==1:
			md = checkfield(md,'fieldname','hydrology.sedimentlimit','>',0.,'numel',[1])

		if self.transfer_flag==1:
			md = checkfield(md,'fieldname','hydrology.leakage_factor','>',0.,'numel',[1])

		md = checkfield(md,'fieldname','hydrology.basal_moulin_input','NaN',1,'Inf',1,'timeseries',1)
		md = checkfield(md,'fieldname','hydrology.spcsediment_head','Inf',1,'timeseries',1)
		md = checkfield(md,'fieldname','hydrology.sediment_compressibility','>',0.,'numel',[1])
		md = checkfield(md,'fieldname','hydrology.sediment_porosity','>',0.,'numel',[1])
		md = checkfield(md,'fieldname','hydrology.sediment_thickness','>',0.,'numel',[1])
		md = checkfield(md,'fieldname','hydrology.sediment_transmitivity','>=',0,'size',[md.mesh.numberofvertices])
		if self.isefficientlayer==1:
			md = checkfield(md,'fieldname','hydrology.spcepl_head','Inf',1,'timeseries',1)
			md = checkfield(md,'fieldname','hydrology.mask_eplactive_node','size',[md.mesh.numberofvertices],'values',[0,1])
			md = checkfield(md,'fieldname','hydrology.epl_compressibility','>',0.,'numel',[1])
			md = checkfield(md,'fieldname','hydrology.epl_porosity','>',0.,'numel',[1])
			md = checkfield(md,'fieldname','hydrology.epl_max_thickness','numel',[1],'>',0.)
			md = checkfield(md,'fieldname','hydrology.epl_initial_thickness','numel',[1],'>',0.)
			md = checkfield(md,'fieldname','hydrology.epl_colapse_thickness','numel',[1],'>',0.)
			md = checkfield(md,'fieldname','hydrology.epl_thick_comp','numel',[1],'values',[0,1])
			md = checkfield(md,'fieldname','hydrology.eplflip_lock','>=',0.,'numel',[1])
			if self.epl_colapse_thickness > self.epl_initial_thickness:
				md.checkmessage('Colapsing thickness for EPL larger than initial thickness')
			md = checkfield(md,'fieldname','hydrology.epl_conductivity','numel',[1],'>',0.)