Ignore:
Timestamp:
12/22/21 10:39:44 (3 years ago)
Author:
Mathieu Morlighem
Message:

merged trunk-jpl and trunk for revision 26742

Location:
issm/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk

  • issm/trunk/test

  • issm/trunk/test/NightlyRun/test2004.py

    r25836 r26744  
    114114hmin = hmin * 1000
    115115hmax = hmax * 1000
    116 tolerance = 100
     116tolerance = 100 # tolerance of 100m on Earth position when merging 3d meshes
    117117threshold = 5
    118118defaultoptions = [
     
    145145    # Vertex connectivity
    146146    md.mesh.vertexconnectivity = NodeConnectivity(md.mesh.elements, md.mesh.numberofvertices)
     147
    147148    # Add model to sl icecaps
    148149    sl.addicecap(md)
     
    178179        print('      reading bedrock')
    179180        md.geometry.bed = -np.ones((md.mesh.numberofvertices, ))
    180     #}}}
    181 
    182     # SLR #{{{
     181        md.geometry.base = md.geometry.bed
     182        md.geometry.thickness = 1000 * np.ones((md.mesh.numberofvertices, ))
     183        md.geometry.surface = md.geometry.bed + md.geometry.thickness
     184    #}}}
     185
     186    # SLC #{{{
    183187    if bas.iscontinentany('antarctica'):
    184188        if testagainst2002:
    185189            # TODO: Check if the following works as expected: 'pos' is empty, so nothing is assigned to 'md.solidearth.surfaceload.icethicknesschange[pos]'
    186             md.solidearth.surfaceload.icethicknesschange = np.zeros((md.mesh.numberofelements, ))
     190            md.masstransport.spcthickness = np.zeros((md.mesh.numberofvertices, ))
    187191            # Antarctica
    188192            late = np.sum(md.mesh.lat[md.mesh.elements - 1], axis=1) / 3
     
    190194            pos = np.where(late < -85)[0]
    191195            ratio = 0.225314032985172 / 0.193045366574523
    192             md.solidearth.surfaceload.icethicknesschange[pos] = -100 * ratio
     196            md.masstransport.spcthickness[md.mesh.elements[pos]] = md.masstransport.spcthickness[md.mesh.elements[pos]] - 100 * ratio
    193197        else:
    194198            delH = np.loadtxt('../Data/AIS_delH_trend.txt')
     
    201205            pos = np.where(longe > 360)[0]
    202206            longe[pos] = longe[pos] - 360
    203             delHAIS = InterpFromMesh2d(index, longAIS, latAIS, delHAIS, longe, late)  # NOTE: Compare to corresponding output under MATLAB to understand why we offset triangle indices by 1 (only caught because Triangle.cpp was producing triangles with negative areas)
     207            delHAIS = InterpFromMesh2d(index, longAIS, latAIS, delHAIS, longe, late) # NOTE: Compare to corresponding output under MATLAB to understand why we offset triangle indices by 1 (only caught because Triangle.cpp was producing triangles with negative areas)
    204208            northpole = find_point(md.mesh.long, md.mesh.lat, 0, 90)
    205209            delHAIS[northpole] = 0
    206             md.solidearth.surfaceload.icethicknesschange = np.mean(delHAIS[md.mesh.elements - 1], axis=1) / 100
    207 
    208         md.solidearth.initialsealevel = np.zeros((md.mesh.numberofvertices, ))
    209 
    210         md.dsl.global_average_thermostatic_sea_level_change = np.zeros((2, 1))
    211         md.dsl.sea_surface_height_change_above_geoid = np.zeros((md.mesh.numberofvertices + 1, 1))
    212         md.dsl.sea_water_pressure_change_at_sea_floor = np.zeros((md.mesh.numberofvertices + 1, 1))
     210            md.masstransport.spcthickness = delHAIS / 100
     211
     212        md.initialization.sealevel = np.zeros((md.mesh.numberofvertices, ))
     213
     214        md.dsl.global_average_thermosteric_sea_level = np.zeros((2, 1))
     215        md.dsl.sea_surface_height_above_geoid = np.zeros((md.mesh.numberofvertices + 1, 1))
     216        md.dsl.sea_water_pressure_at_sea_floor = np.zeros((md.mesh.numberofvertices + 1, 1))
    213217    #}}}
    214218
     
    226230# Parameterize continents #{{{
    227231for ind in sl.basinindx('continent', ['hemisphereeast', 'hemispherewest']):
    228     print("Masks for basin {}".format(sl.icecaps[ind].miscellaneous.name))
     232    print('Masks for basin {}'.format(sl.icecaps[ind].miscellaneous.name))
    229233    md = sl.icecaps[ind]
    230234    bas = sl.basins[ind]
     
    283287    #}}}
    284288
    285     # SLR loading/calibration #{{{
    286     md.solidearth.surfaceload.icethicknesschange = np.zeros((md.mesh.numberofelements, ))
     289    # SLC loading/calibration #{{{
     290    md.masstransport.spcthickness = np.zeros((md.mesh.numberofvertices, ))
    287291
    288292    if testagainst2002:
     
    293297        pos = np.where(np.logical_and.reduce((late > 70, late < 80, longe > -60, longe < -30)))[0]
    294298        ratio = .3823 / .262344
     299        md.masstransport.spcthickness[md.mesh.elements[pos]] = md.masstransport.spcthickness[md.mesh.elements[pos]] - 100 * ratio
    295300
    296301        # Correct mask
     
    307312        pos = np.where(longe > 360)[0]
    308313        longe[pos] = longe[pos] - 360
    309         delHGIS = InterpFromMeshToMesh2d(index, longGIS, latGIS, delHGIS, longe, late) # NOTE: Compare to corresponding ouptut under MATLAB to understand why we offset triangle indices by 1 (only caught because Triangle.cpp was producing triangles with negative areas)
    310         delHGISe = np.mean(delHGIS[md.mesh.elements - 1], axis=1).flatten()
     314        delHGIS = InterpFromMeshToMesh2d(index, longGIS, latGIS, delHGIS, longe, late)
    311315
    312316        delH = np.loadtxt('../Data/GLA_delH_trend_15regions.txt')
     
    319323        pos = np.where(longe > 360)[0]
    320324        longe[pos] = longe[pos] - 360
    321         delHGLA = InterpFromMeshToMesh2d(index, longGLA, latGLA, delHGLA, longe, late) # NOTE: Compare to corresponding ouptut under MATLAB to understand why we offset triangle indices by 1 (only caught because Triangle.cpp was producing triangles with negative areas)
    322         delHGLAe = np.mean(delHGLA[md.mesh.elements - 1], axis=1).flatten()
    323 
    324         pos = np.nonzero(delHGISe)[0]
    325         md.solidearth.surfaceload.icethicknesschange[pos] = delHGISe[pos] / 100
    326         pos = np.nonzero(delHGLAe)[0]
    327         md.solidearth.surfaceload.icethicknesschange[pos] = delHGLAe[pos] / 100
     325        delHGLA = InterpFromMeshToMesh2d(index, longGLA, latGLA, delHGLA, longe, late)
     326
     327        # NOTE: For some reason, cannot apply pos to multiple arrays in a
     328        #       singlelike we might do in MATLAB. Instead, we iterate over
     329        #       elements of pos.
     330        #
     331        pos = np.nonzero(delHGIS)[0]
     332        for p in pos:
     333            md.masstransport.spcthickness[p] = md.masstransport.spcthickness[p] - delHGIS[p] / 100
     334        pos = np.nonzero(delHGLA)[0]
     335        for p in pos:
     336            md.masstransport.spcthickness[p] = md.masstransport.spcthickness[p] - delHGLA[p] / 100
    328337
    329338        # Adjust mask accordingly
    330         pos = np.nonzero(md.solidearth.surfaceload.icethicknesschange)[0]
    331         flags = np.zeros((md.mesh.numberofvertices, ))
    332         flags[md.mesh.elements[pos, :] - 1] = 1
    333         pos = np.nonzero(flags)[0]
     339        pos = np.nonzero(md.masstransport.spcthickness)[0]
    334340        md.mask.ice_levelset[pos] = -1
    335341        md.mask.ocean_levelset[pos] = 1
    336342
    337     md.solidearth.initialsealevel = np.zeros((md.mesh.numberofvertices, ))
    338 
    339     md.dsl.global_average_thermostatic_sea_level_change = np.zeros((2, 1))
    340     md.dsl.sea_surface_height_change_above_geoid = np.zeros((md.mesh.numberofvertices + 1, 1))
    341     md.dsl.sea_water_pressure_change_at_sea_floor = np.zeros((md.mesh.numberofvertices + 1, 1))
    342     #}}}
     343    md.initialization.sealevel = np.zeros((md.mesh.numberofvertices, ))
     344
     345    md.dsl.global_average_thermosteric_sea_level = np.zeros((2, 1))
     346    md.dsl.sea_surface_height_above_geoid = np.zeros((md.mesh.numberofvertices + 1, 1))
     347    md.dsl.sea_water_pressure_at_sea_floor = np.zeros((md.mesh.numberofvertices + 1, 1))
     348    #}}}
     349
    343350    # Geometry #{{{
    344351    di = md.materials.rho_ice / md.materials.rho_water
    345352    md.geometry.bed = -np.ones((md.mesh.numberofvertices, ))
     353    md.geometry.base = md.geometry.bed
     354    md.geometry.thickness = 1000 * np.ones((md.mesh.numberofvertices, ))
     355    md.geometry.surface = md.geometry.bed + md.geometry.thickness
    346356    #}}}
    347357    # Materials #{{{
     
    375385sl.transfer('mask.ocean_levelset')
    376386sl.transfer('geometry.bed')
     387sl.transfer('geometry.surface')
     388sl.transfer('geometry.thickness')
     389sl.transfer('geometry.base')
    377390sl.transfer('mesh.lat')
    378391sl.transfer('mesh.long')
    379 sl.transfer('solidearth.surfaceload.icethicknesschange') #
    380 sl.transfer('solidearth.initialsealevel')
    381 sl.transfer('dsl.sea_surface_height_change_above_geoid')
    382 sl.transfer('dsl.sea_water_pressure_change_at_sea_floor')
     392sl.transfer('masstransport.spcthickness') #
     393sl.transfer('initialization.sealevel')
     394sl.transfer('dsl.sea_surface_height_above_geoid')
     395sl.transfer('dsl.sea_water_pressure_at_sea_floor')
    383396
    384397# Radius
     
    398411
    399412# Solve Sea-level equation on Earth only #{{{
    400 md = sl.earth #we don't do computations on ice sheets or land
     413md = sl.earth # we don't do computations on ice sheets or land
    401414
    402415#Materials
    403 md.materials=materials('hydro')
     416md.materials = materials('hydro')
    404417
    405418# Elastic loading from love numbers
     
    411424
    412425# New stuff
    413 md.dsl.global_average_thermosteric_sea_level_change = np.array([[(1.1 + .38)], [0]]) # steric + water storage AR5
     426md.dsl.global_average_thermosteric_sea_level = np.array([[(1.1 + .38)], [0]]) # steric + water storage AR5
    414427
    415428# Solutuion parameters
    416429md.solidearth.settings.reltol = np.nan
    417430md.solidearth.settings.abstol = 1e-3
    418 md.solidearth.settings.computesealevelchange = 1
     431md.solidearth.settings.sealevelloading = 1
     432md.solidearth.settings.isgrd = 1
     433md.solidearth.settings.ocean_area_scaling = 1
     434md.solidearth.settings.grdmodel = 1
    419435md.timestepping.time_step = 1
     436
     437# Physics
     438md.transient.issmb = 0
     439md.transient.isstressbalance = 0
     440md.transient.isthermal = 0
     441md.transient.ismasstransport = 1
     442md.transient.isslc = 1
     443
     444# Initializations
     445md.basalforcings.groundedice_melting_rate = np.zeros((md.mesh.numberofvertices,))
     446md.basalforcings.floatingice_melting_rate = np.zeros((md.mesh.numberofvertices,))
     447md.initialization.vx = np.zeros((md.mesh.numberofvertices,))
     448md.initialization.vy = np.zeros((md.mesh.numberofvertices,))
     449md.initialization.sealevel = np.zeros((md.mesh.numberofvertices,))
     450md.initialization.bottompressure = np.zeros((md.mesh.numberofvertices,))
     451md.initialization.dsl = np.zeros((md.mesh.numberofvertices,))
     452md.initialization.str = 0
     453md.smb.mass_balance = np.zeros((md.mesh.numberofvertices,))
    420454
    421455# Max number of iterations reverted back to 10 (i.e. the original default value)
     
    423457
    424458# Eustatic run:
    425 md.solidearth.settings.rigid = 0
     459md.solidearth.settings.selfattraction = 0
    426460md.solidearth.settings.elastic = 0
    427461md.solidearth.settings.rotation = 0
     462md.solidearth.settings.viscous = 0
    428463md.solidearth.requested_outputs = [
    429464    'default',
    430     'SurfaceloadIceThicknessChange',
     465    'DeltaIceThickness',
    431466    'Sealevel',
    432     'SealevelRSLRate',
    433     'SealevelriseCumDeltathickness',
    434     'SealevelNEsaRate',
    435     'SealevelUEsaRate',
    436     'NGiaRate',
    437     'UGiaRate',
    438     'SealevelEustaticMask',
    439     'SealevelEustaticOceanMask'
     467    'SealevelUGrd',
     468    'SealevelchangeBarystaticMask',
     469    'SealevelchangeBarystaticOceanMask',
    440470]
    441 md = solve(md, 'Sealevelrise')
    442 Seustatic = md.results.SealevelriseSolution.Sealevel
    443 
    444 # Eustatic + rigid run
    445 md.solidearth.settings.rigid = 1
     471md = solve(md, 'Transient')
     472Seustatic = md.results.TransientSolution.Sealevel
     473
     474# Eustatic + selfattraction run
     475md.solidearth.settings.selfattraction = 1
    446476md.solidearth.settings.elastic = 0
    447477md.solidearth.settings.rotation = 0
    448 md = solve(md, 'Sealevelrise')
    449 Srigid = md.results.SealevelriseSolution.Sealevel
    450 
    451 # Eustatic + rigid + elastic run
    452 md.solidearth.settings.rigid = 1
     478md.solidearth.settings.viscous = 0
     479md = solve(md, 'Transient')
     480Sselfattraction = md.results.TransientSolution.Sealevel
     481
     482# Eustatic + selfattraction + elastic run
     483md.solidearth.settings.selfattraction = 1
    453484md.solidearth.settings.elastic = 1
    454485md.solidearth.settings.rotation = 0
    455 md = solve(md, 'Sealevelrise')
    456 Selastic = md.results.SealevelriseSolution.Sealevel
    457 
    458 # Eustatic + rigid + elastic + rotation run
    459 md.solidearth.settings.rigid = 1
     486md.solidearth.settings.viscous = 0
     487md = solve(md, 'Transient')
     488Selastic = md.results.TransientSolution.Sealevel
     489
     490# Eustatic + selfattraction + elastic + rotation run
     491md.solidearth.settings.selfattraction = 1
    460492md.solidearth.settings.elastic = 1
    461493md.solidearth.settings.rotation = 1
    462 md = solve(md, 'Sealevelrise')
    463 Srotation = md.results.SealevelriseSolution.Sealevel
     494md.solidearth.settings.viscous = 0
     495md = solve(md, 'Transient')
     496Srotation = md.results.TransientSolution.Sealevel
    464497
    465498#Fields and tolerances to track changes
    466499field_names = ['Eustatic', 'Rigid', 'Elastic', 'Rotation']
    467500field_tolerances = [1e-13, 1e-13, 1e-13, 1e-13]
    468 field_values = [Seustatic, Srigid, Selastic, Srotation]
     501field_values = [Seustatic, Sselfattraction, Selastic, Srotation]
Note: See TracChangeset for help on using the changeset viewer.