Exemplo n.º 1
0
 def extrude(self, md):  # {{{
     self.mantle_viscosity = project3d(md, 'vector', self.mantle_viscosity,
                                       'type', 'node')
     self.lithosphere_thickness = project3d(md, 'vector',
                                            self.lithosphere_thickness,
                                            'type', 'node')
     return self
Exemplo n.º 2
0
 def extrude(self, md):  # {{{
     self.ice_levelset = project3d(md, 'vector', self.ice_levelset, 'type',
                                   'node')
     self.groundedice_levelset = project3d(md, 'vector',
                                           self.groundedice_levelset,
                                           'type', 'node')
     return self
Exemplo n.º 3
0
    def extrude(self, md):  # {{{
        self.vx = project3d(md, 'vector', self.vx, 'type', 'node')
        self.vy = project3d(md, 'vector', self.vy, 'type', 'node')
        self.vz = project3d(md, 'vector', self.vz, 'type', 'node')
        self.vel = project3d(md, 'vector', self.vel, 'type', 'node')
        self.temperature = project3d(md, 'vector', self.temperature, 'type',
                                     'node')
        self.waterfraction = project3d(md, 'vector', self.waterfraction,
                                       'type', 'node')
        self.watercolumn = project3d(md, 'vector', self.watercolumn, 'type',
                                     'node')
        self.sediment_head = project3d(md, 'vector', self.sediment_head,
                                       'type', 'node', 'layer', 1)
        self.epl_head = project3d(md, 'vector', self.epl_head, 'type', 'node',
                                  'layer', 1)
        self.epl_thickness = project3d(md, 'vector', self.epl_thickness,
                                       'type', 'node', 'layer', 1)

        #Lithostatic pressure by default
        #		self.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface[:,0]-md.mesh.z)
        #self.pressure=md.constants.g*md.materials.rho_ice*(md.geometry.surface-md.mesh.z.reshape(-1,))

        if np.ndim(md.geometry.surface) == 2:
            print(
                'Reshaping md.geometry.surface for you convenience but you should fix it in you files'
            )
            self.pressure = md.constants.g * md.materials.rho_ice * (
                md.geometry.surface.reshape(-1, ) - md.mesh.z)
        else:
            self.pressure = md.constants.g * md.materials.rho_ice * (
                md.geometry.surface - md.mesh.z)

        return self
Exemplo n.º 4
0
	def extrude(self,md): # {{{
		self.spcsediment_head=project3d(md,'vector',self.spcsediment_head,'type','node','layer',1)
		self.sediment_transmitivity=project3d(md,'vector',self.sediment_transmitivity,'type','node','layer',1)
		self.basal_moulin_input=project3d(md,'vector',self.basal_moulin_input,'type','node','layer',1)
		if self.isefficientlayer==1 :
			self.spcepl_head=project3d(md,'vector',self.spcepl_head,'type','node','layer',1)
			self.mask_eplactive_node=project3d(md,'vector',self.mask_eplactive_node,'type','node','layer',1)
		return self
Exemplo n.º 5
0
 def extrude(self, md):  # {{{
     self.groundedice_melting_rate = project3d(
         md, 'vector', self.groundedice_melting_rate, 'type', 'node',
         'layer', 1)
     self.geothermalflux = project3d(md, 'vector', self.geothermalflux,
                                     'type', 'node', 'layer',
                                     1)  #bedrock only gets geothermal flux
     return self
Exemplo n.º 6
0
 def extrude(self, md):  # {{{
     self.coefficient = project3d(md, 'vector', self.coefficient, 'type',
                                  'node', 'layer', 1)
     self.coefficientcoulomb = project3d(md, 'vector',
                                         self.coefficientcoulomb, 'type',
                                         'node', 'layer', 1)
     self.p = project3d(md, 'vector', self.p, 'type', 'element')
     self.q = project3d(md, 'vector', self.q, 'type', 'element')
     return self
Exemplo n.º 7
0
 def extrude(self, md):  # {{{
     self.element_equation = project3d(md, 'vector', self.element_equation,
                                       'type', 'element')
     self.vertex_equation = project3d(md, 'vector', self.vertex_equation,
                                      'type', 'node')
     self.borderSSA = project3d(md, 'vector', self.borderSSA, 'type',
                                'node')
     self.borderHO = project3d(md, 'vector', self.borderHO, 'type', 'node')
     self.borderFS = project3d(md, 'vector', self.borderFS, 'type', 'node')
     return self
Exemplo n.º 8
0
    def extrude(self, md):  # {{{

        if self.isd18opd:
            self.temperatures_presentday = project3d(
                md, 'vector', self.temperatures_presentday, 'type', 'node')
        if self.isd18opd:
            self.precipitations_presentday = project3d(
                md, 'vector', self.precipitations_presentday, 'type', 'node')
        self.s0p = project3d(md, 'vector', self.s0p, 'type', 'node')
        self.s0t = project3d(md, 'vector', self.s0t, 'type', 'node')

        return self
Exemplo n.º 9
0
 def extrude(self, md):  # {{{
     self.vx_obs = project3d(md, 'vector', self.vx_obs, 'type', 'node')
     self.vy_obs = project3d(md, 'vector', self.vy_obs, 'type', 'node')
     self.vel_obs = project3d(md, 'vector', self.vel_obs, 'type', 'node')
     self.thickness_obs = project3d(md, 'vector', self.thickness_obs,
                                    'type', 'node')
     if not np.any(np.isnan(self.cost_functions_coefficients)):
         self.cost_functions_coefficients = project3d(
             md, 'vector', self.cost_functions_coefficients, 'type', 'node')
     if not np.any(np.isnan(self.min_parameters)):
         self.min_parameters = project3d(md, 'vector', self.min_parameters,
                                         'type', 'node')
     if not np.any(np.isnan(self.max_parameters)):
         self.max_parameters = project3d(md, 'vector', self.max_parameters,
                                         'type', 'node')
     return self
Exemplo n.º 10
0
 def extrude(self, md):  # {{{
     self.D = project3d(md, 'vector', self.D, 'type', 'node')
     self.spcdamage = project3d(md, 'vector', self.spcdamage, 'type',
                                'node')
     return self
Exemplo n.º 11
0
    def extrude(self, md):  # {{{

        if not (self.isdelta18o and self.ismungsm):
            self.precipitation = project3d(md, 'vector', self.precipitation,
                                           'type', 'node')
            self.monthlytemperatures = project3d(md, 'vector',
                                                 self.monthlytemperatures,
                                                 'type', 'node')
        if self.isdelta18o:
            self.temperatures_lgm = project3d(md, 'vector',
                                              self.temperatures_lgm, 'type',
                                              'node')
        if self.isdelta18o:
            self.temperatures_presentday = project3d(
                md, 'vector', self.temperatures_presentday, 'type', 'node')
        if self.isdelta18o:
            self.precipitations_presentday = project3d(
                md, 'vector', self.precipitations_presentday, 'type', 'node')
        if self.isdelta18o:
            self.precipitations_lgm = project3d(md, 'vector',
                                                self.precipitations_lgm,
                                                'type', 'node')
        if self.ismungsm:
            self.temperatures_lgm = project3d(md, 'vector',
                                              self.temperatures_lgm, 'type',
                                              'node')
        if self.ismungsm:
            self.temperatures_presentday = project3d(
                md, 'vector', self.temperatures_presentday, 'type', 'node')
        if self.ismungsm:
            self.precipitations_presentday = project3d(
                md, 'vector', self.precipitations_presentday, 'type', 'node')
        if self.ismungsm:
            self.precipitations_lgm = project3d(md, 'vector',
                                                self.precipitations_lgm,
                                                'type', 'node')
        self.s0p = project3d(md, 'vector', self.s0p, 'type', 'node')
        self.s0t = project3d(md, 'vector', self.s0t, 'type', 'node')

        return self
Exemplo n.º 12
0
 def extrude(self, md):  # {{{
     self.spclevelset = project3d(md, 'vector', self.spclevelset, 'type',
                                  'node')
     return self
Exemplo n.º 13
0
 def extrude(self, md):  # {{{
     self.rheology_B = project3d(md, 'vector', self.rheology_B, 'type',
                                 'node')
     self.rheology_n = project3d(md, 'vector', self.rheology_n, 'type',
                                 'element')
     return self
Exemplo n.º 14
0
    def extrude(md, *args):  # {{{
        """
		EXTRUDE - vertically extrude a 2d mesh

		   vertically extrude a 2d mesh and create corresponding 3d mesh.
		   The vertical distribution can:
		    - follow a polynomial law
		    - follow two polynomial laws, one for the lower part and one for the upper part of the mesh
		    - be discribed by a list of coefficients (between 0 and 1)
 

		   Usage:
		      md=extrude(md,numlayers,extrusionexponent)
		      md=extrude(md,numlayers,lowerexponent,upperexponent)
		      md=extrude(md,listofcoefficients)

		   Example:
				md=extrude(md,15,1.3);
				md=extrude(md,15,1.3,1.2);
				md=extrude(md,[0 0.2 0.5 0.7 0.9 0.95 1])

		   See also: MODELEXTRACT, COLLAPSE
		"""

        #some checks on list of arguments
        if len(args) > 3 or len(args) < 1:
            raise RuntimeError("extrude error message")

        #Extrude the mesh
        if len(args) == 1:  #list of coefficients
            clist = args[0]
            if any(clist < 0) or any(clist > 1):
                raise TypeError(
                    "extrusioncoefficients must be between 0 and 1")
            clist.extend([0., 1.])
            clist.sort()
            extrusionlist = list(set(clist))
            numlayers = len(extrusionlist)

        elif len(args) == 2:  #one polynomial law
            if args[1] <= 0:
                raise TypeError("extrusionexponent must be >=0")
            numlayers = args[0]
            extrusionlist = (np.arange(0.,
                                       float(numlayers - 1) + 1., 1.) /
                             float(numlayers - 1))**args[1]

        elif len(args) == 3:  #two polynomial laws
            numlayers = args[0]
            lowerexp = args[1]
            upperexp = args[2]

            if args[1] <= 0 or args[2] <= 0:
                raise TypeError(
                    "lower and upper extrusionexponents must be >=0")

            lowerextrusionlist = (np.arange(
                0., 1. + 2. / float(numlayers - 1),
                2. / float(numlayers - 1)))**lowerexp / 2.
            upperextrusionlist = (np.arange(
                0., 1. + 2. / float(numlayers - 1),
                2. / float(numlayers - 1)))**upperexp / 2.
            extrusionlist = np.unique(
                np.concatenate((lowerextrusionlist, 1. - upperextrusionlist)))

        if numlayers < 2:
            raise TypeError("number of layers should be at least 2")
        if md.mesh.__class__.__name__ == 'mesh3dprisms':
            raise TypeError(
                "Cannot extrude a 3d mesh (extrude cannot be called more than once)"
            )

        #Initialize with the 2d mesh
        mesh2d = md.mesh
        md.mesh = mesh3dprisms()
        md.mesh.x = mesh2d.x
        md.mesh.y = mesh2d.y
        md.mesh.elements = mesh2d.elements
        md.mesh.numberofelements = mesh2d.numberofelements
        md.mesh.numberofvertices = mesh2d.numberofvertices

        md.mesh.lat = mesh2d.lat
        md.mesh.long = mesh2d.long
        md.mesh.epsg = mesh2d.epsg

        md.mesh.vertexonboundary = mesh2d.vertexonboundary
        md.mesh.vertexconnectivity = mesh2d.vertexconnectivity
        md.mesh.elementconnectivity = mesh2d.elementconnectivity
        md.mesh.average_vertex_connectivity = mesh2d.average_vertex_connectivity

        md.mesh.extractedvertices = mesh2d.extractedvertices
        md.mesh.extractedelements = mesh2d.extractedelements

        x3d = np.empty((0))
        y3d = np.empty((0))
        z3d = np.empty((0))  #the lower node is on the bed
        thickness3d = md.geometry.thickness  #thickness and bed for these nodes
        bed3d = md.geometry.base

        #Create the new layers
        for i in xrange(numlayers):
            x3d = np.concatenate((x3d, md.mesh.x))
            y3d = np.concatenate((y3d, md.mesh.y))
            #nodes are distributed between bed and surface accordingly to the given exponent
            z3d = np.concatenate(
                (z3d, (bed3d + thickness3d * extrusionlist[i]).reshape(-1)))
        number_nodes3d = np.size(
            x3d)  #number of 3d nodes for the non extruded part of the mesh

        #Extrude elements
        elements3d = np.empty((0, 6), int)
        for i in xrange(numlayers - 1):
            elements3d = np.vstack(
                (elements3d,
                 np.hstack(
                     (md.mesh.elements + i * md.mesh.numberofvertices,
                      md.mesh.elements + (i + 1) * md.mesh.numberofvertices)))
            )  #Create the elements of the 3d mesh for the non extruded part
        number_el3d = np.size(
            elements3d,
            axis=0)  #number of 3d nodes for the non extruded part of the mesh

        #Keep a trace of lower and upper nodes
        lowervertex = np.nan * np.ones(number_nodes3d, int)
        uppervertex = np.nan * np.ones(number_nodes3d, int)
        lowervertex[md.mesh.numberofvertices:] = np.arange(
            1, (numlayers - 1) * md.mesh.numberofvertices + 1)
        uppervertex[:(numlayers - 1) * md.mesh.numberofvertices] = np.arange(
            md.mesh.numberofvertices + 1, number_nodes3d + 1)
        md.mesh.lowervertex = lowervertex
        md.mesh.uppervertex = uppervertex

        #same for lower and upper elements
        lowerelements = np.nan * np.ones(number_el3d, int)
        upperelements = np.nan * np.ones(number_el3d, int)
        lowerelements[md.mesh.numberofelements:] = np.arange(
            1, (numlayers - 2) * md.mesh.numberofelements + 1)
        upperelements[:(numlayers - 2) * md.mesh.numberofelements] = np.arange(
            md.mesh.numberofelements + 1,
            (numlayers - 1) * md.mesh.numberofelements + 1)
        md.mesh.lowerelements = lowerelements
        md.mesh.upperelements = upperelements

        #Save old mesh
        md.mesh.x2d = md.mesh.x
        md.mesh.y2d = md.mesh.y
        md.mesh.elements2d = md.mesh.elements
        md.mesh.numberofelements2d = md.mesh.numberofelements
        md.mesh.numberofvertices2d = md.mesh.numberofvertices

        #Build global 3d mesh
        md.mesh.elements = elements3d
        md.mesh.x = x3d
        md.mesh.y = y3d
        md.mesh.z = z3d
        md.mesh.numberofelements = number_el3d
        md.mesh.numberofvertices = number_nodes3d
        md.mesh.numberoflayers = numlayers

        #Ok, now deal with the other fields from the 2d mesh:

        #bedinfo and surface info
        md.mesh.vertexonbase = project3d(
            md, 'vector', np.ones(md.mesh.numberofvertices2d, bool), 'type',
            'node', 'layer', 1)
        md.mesh.vertexonsurface = project3d(
            md, 'vector', np.ones(md.mesh.numberofvertices2d, bool), 'type',
            'node', 'layer', md.mesh.numberoflayers)
        md.mesh.vertexonboundary = project3d(md, 'vector',
                                             md.mesh.vertexonboundary, 'type',
                                             'node')

        #lat long
        md.mesh.lat = project3d(md, 'vector', md.mesh.lat, 'type', 'node')
        md.mesh.long = project3d(md, 'vector', md.mesh.long, 'type', 'node')

        md.geometry.extrude(md)
        md.friction.extrude(md)
        md.inversion.extrude(md)
        md.smb.extrude(md)
        md.initialization.extrude(md)
        md.flowequation.extrude(md)

        md.stressbalance.extrude(md)
        md.thermal.extrude(md)
        md.masstransport.extrude(md)

        # Calving variables
        md.hydrology.extrude(md)
        md.levelset.extrude(md)
        md.calving.extrude(md)

        #connectivity
        md.mesh.elementconnectivity = np.tile(md.mesh.elementconnectivity,
                                              (numlayers - 1, 1))
        md.mesh.elementconnectivity[np.nonzero(
            md.mesh.elementconnectivity == 0)] = -sys.maxint - 1
        if not np.isnan(md.mesh.elementconnectivity).all():
            for i in xrange(1, numlayers - 1):
                md.mesh.elementconnectivity[i*md.mesh.numberofelements2d:(i+1)*md.mesh.numberofelements2d,:] \
                  =md.mesh.elementconnectivity[i*md.mesh.numberofelements2d:(i+1)*md.mesh.numberofelements2d,:]+md.mesh.numberofelements2d
                md.mesh.elementconnectivity[np.nonzero(
                    md.mesh.elementconnectivity < 0)] = 0

        md.materials.extrude(md)
        md.damage.extrude(md)
        md.gia.extrude(md)
        md.mask.extrude(md)
        md.qmu.extrude(md)
        md.basalforcings.extrude(md)

        #increase connectivity if less than 25:
        if md.mesh.average_vertex_connectivity <= 25:
            md.mesh.average_vertex_connectivity = 100

        return md
Exemplo n.º 15
0
 def extrude(self, md):  # {{{
     self.spcthickness = project3d(md, 'vector', self.spcthickness, 'type',
                                   'node')
     return self
Exemplo n.º 16
0
    def extrude(self, md):  # {{{

        self.mass_balance = project3d(md, 'vector', self.mass_balance, 'type',
                                      'node')
        return self
Exemplo n.º 17
0
 def extrude(self, md):  # {{{
     self.calvingrate = project3d(md, 'vector', self.calvingrate, 'type',
                                  'node')
     self.meltingrate = project3d(md, 'vector', self.meltingrate, 'type',
                                  'node')
     return self