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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.)