Skip to content

Commit 810ed27

Browse files
authored
Merge pull request #1525 from GEOS-ESM/feature/esmf-regrid-termorder-srcterm
Make direct ESMF regridding deterministic
2 parents fb9c827 + ac4f13b commit 810ed27

2 files changed

Lines changed: 24 additions & 13 deletions

File tree

‎GEOS_GcmGridComp.F90‎

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2870,7 +2870,7 @@ subroutine DO_A2W(SRC,DST,NAME,RC)
28702870
integer, optional,intent(out) :: RC
28712871

28722872
character(len=ESMF_MAXSTR), parameter :: Iam = 'A2W'
2873-
integer :: status
2873+
integer :: status, srcTermProcessing
28742874

28752875
type(ESMF_RouteHandle), pointer :: rh
28762876
type(ESMF_Field) :: srcField, dstField
@@ -2884,9 +2884,11 @@ subroutine DO_A2W(SRC,DST,NAME,RC)
28842884
!ALT: this should be done only once per regridder
28852885
allocate(rh, stat=status)
28862886
VERIFY_(STATUS)
2887+
srcTermProcessing = 0
28872888
call ESMF_FieldRegridStore(srcField, dstField, &
28882889
regridmethod=ESMF_REGRIDMETHOD_BILINEAR, &
28892890
lineType=ESMF_LINETYPE_GREAT_CIRCLE, &
2891+
srcTermProcessing=srcTermProcessing, &
28902892
routeHandle=rh, rc=status)
28912893
VERIFY_(STATUS)
28922894

@@ -2900,7 +2902,7 @@ subroutine DO_A2W(SRC,DST,NAME,RC)
29002902
end if
29012903

29022904
call ESMF_FieldRegrid(srcField=srcField, dstField=dstField, &
2903-
routeHandle=rh, rc=status)
2905+
routeHandle=rh, termorderflag=ESMF_TERMORDER_SRCSEQ, rc=status)
29042906
VERIFY_(STATUS)
29052907

29062908
RETURN_(ESMF_SUCCESS)
@@ -2913,7 +2915,7 @@ subroutine DO_W2A(SRC,DST,NAME,RC)
29132915
integer, optional,intent(out) :: RC
29142916

29152917
character(len=ESMF_MAXSTR), parameter :: Iam = 'W2A'
2916-
integer :: status
2918+
integer :: status, srcTermProcessing
29172919

29182920
type(ESMF_RouteHandle), pointer :: rh
29192921
type(ESMF_Field) :: srcField, dstField
@@ -2927,9 +2929,11 @@ subroutine DO_W2A(SRC,DST,NAME,RC)
29272929
!ALT: this should be done only once per regridder
29282930
allocate(rh, stat=status)
29292931
VERIFY_(STATUS)
2932+
srcTermProcessing = 0
29302933
call ESMF_FieldRegridStore(srcField, dstField, &
29312934
regridmethod=ESMF_REGRIDMETHOD_BILINEAR, &
29322935
lineType=ESMF_LINETYPE_GREAT_CIRCLE, &
2936+
srcTermProcessing=srcTermProcessing, &
29332937
routeHandle=rh, rc=status)
29342938
VERIFY_(STATUS)
29352939

@@ -2943,7 +2947,7 @@ subroutine DO_W2A(SRC,DST,NAME,RC)
29432947
end if
29442948

29452949
call ESMF_FieldRegrid(srcField=srcField, dstField=dstField, &
2946-
routeHandle=rh, rc=status)
2950+
routeHandle=rh, termorderflag=ESMF_TERMORDER_SRCSEQ, rc=status)
29472951
VERIFY_(STATUS)
29482952

29492953
RETURN_(ESMF_SUCCESS)
@@ -2956,7 +2960,7 @@ subroutine DO_O2W(SRC,DST,NAME,RC)
29562960
integer, optional,intent(out) :: RC
29572961

29582962
character(len=ESMF_MAXSTR), parameter :: Iam = 'O2W'
2959-
integer :: status
2963+
integer :: status, srcTermProcessing
29602964

29612965
type(ESMF_RouteHandle), pointer :: rh
29622966
type(ESMF_Field) :: srcField, dstField
@@ -2970,9 +2974,11 @@ subroutine DO_O2W(SRC,DST,NAME,RC)
29702974
!ALT: this should be done only once per regridder
29712975
allocate(rh, stat=status)
29722976
VERIFY_(STATUS)
2977+
srcTermProcessing = 0
29732978
call ESMF_FieldRegridStore(srcField, dstField, &
29742979
regridmethod=ESMF_REGRIDMETHOD_BILINEAR, &
29752980
lineType=ESMF_LINETYPE_GREAT_CIRCLE, &
2981+
srcTermProcessing=srcTermProcessing, &
29762982
routeHandle=rh, rc=status)
29772983
VERIFY_(STATUS)
29782984

@@ -2986,7 +2992,7 @@ subroutine DO_O2W(SRC,DST,NAME,RC)
29862992
end if
29872993

29882994
call ESMF_FieldRegrid(srcField=srcField, dstField=dstField, &
2989-
routeHandle=rh, rc=status)
2995+
routeHandle=rh, termorderflag=ESMF_TERMORDER_SRCSEQ, rc=status)
29902996
VERIFY_(STATUS)
29912997

29922998
RETURN_(ESMF_SUCCESS)
@@ -2999,7 +3005,7 @@ subroutine DO_W2O(SRC,DST,NAME,RC)
29993005
integer, optional,intent(out) :: RC
30003006

30013007
character(len=ESMF_MAXSTR), parameter :: Iam = 'W2O'
3002-
integer :: status
3008+
integer :: status, srcTermProcessing
30033009

30043010
type(ESMF_RouteHandle), pointer :: rh
30053011
type(ESMF_Field) :: srcField, dstField
@@ -3013,10 +3019,12 @@ subroutine DO_W2O(SRC,DST,NAME,RC)
30133019
!ALT: this should be done only once per regridder
30143020
allocate(rh, stat=status)
30153021
VERIFY_(STATUS)
3022+
srcTermProcessing = 0
30163023
call ESMF_FieldRegridStore(srcField, dstField, &
30173024
regridMethod=ESMF_REGRIDMETHOD_BILINEAR, &
30183025
lineType=ESMF_LINETYPE_GREAT_CIRCLE, &
30193026
routeHandle=rh, &
3027+
srcTermProcessing=srcTermProcessing, &
30203028
unmappedAction=ESMF_UNMAPPEDACTION_IGNORE, rc=status)
30213029
VERIFY_(STATUS)
30223030

@@ -3031,7 +3039,7 @@ subroutine DO_W2O(SRC,DST,NAME,RC)
30313039
end if
30323040

30333041
call ESMF_FieldRegrid(srcField=srcField, dstField=dstField, &
3034-
routeHandle=rh, rc=status)
3042+
routeHandle=rh, termorderflag=ESMF_TERMORDER_SRCSEQ, rc=status)
30353043
VERIFY_(STATUS)
30363044

30373045
RETURN_(ESMF_SUCCESS)
@@ -3043,4 +3051,3 @@ end subroutine Run
30433051
! for example call ESMF_FieldRegridRelease(routeHandle, rc=status)
30443052

30453053
end module GEOS_GcmGridCompMod
3046-

‎GEOSagcm_GridComp/GEOSphysics_GridComp/GEOSsurface_GridComp/GEOSlandice_GridComp/GEOSissm_GridComp/GEOS_ISSMGridComp.F90‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ subroutine Initialize ( GC, IMPORT, EXPORT, CLOCK, RC )
349349
! ErrLog Variables
350350
character(len=ESMF_MAXSTR) :: IAm
351351
integer :: STATUS
352+
integer :: srcTermProcessing
352353
character(len=ESMF_MAXSTR) :: COMP_NAME
353354

354355
! virtual machine / mpi comm
@@ -575,13 +576,16 @@ subroutine Initialize ( GC, IMPORT, EXPORT, CLOCK, RC )
575576
gridField = ESMF_FieldCreate(grid=grid,typekind=ESMF_TYPEKIND_R4,_RC)
576577

577578
! create routehandle for mesh-to-grid regridding (set srcMaskValues to 1 if needed... )
579+
srcTermProcessing = 0
578580
call ESMF_FieldRegridStore(srcField=meshField, dstField=gridField,routehandle=routehandle_m2g,&
579581
unmappedaction=ESMF_UNMAPPEDACTION_IGNORE,extrapmethod=ESMF_EXTRAPMETHOD_CREEP,&
580-
extrapNumLevels=1,_RC)
582+
extrapNumLevels=1,srcTermProcessing=srcTermProcessing,_RC)
581583

582584
! create routehandle for grid-to-mesh regridding (set dstMaskValues to 1 if needed... )
585+
srcTermProcessing = 0
583586
call ESMF_FieldRegridStore(srcField=gridField, dstField=meshField,routehandle=routehandle_g2m,&
584-
unmappedaction=ESMF_UNMAPPEDACTION_IGNORE,extrapmethod=ESMF_EXTRAPMETHOD_NEAREST_D,_RC)
587+
unmappedaction=ESMF_UNMAPPEDACTION_IGNORE,extrapmethod=ESMF_EXTRAPMETHOD_NEAREST_D,&
588+
srcTermProcessing=srcTermProcessing,_RC)
585589

586590
! create component's private internal state
587591
! stores everything needed for regrid and halo operations during run method
@@ -1383,7 +1387,7 @@ subroutine mesh_to_tile(VAR_MESH,VAR_TILE,RC)
13831387
VAR_GRID(:,:) = MAPL_UNDEF
13841388
! regrid field from mesh to grid
13851389
call ESMF_FieldRegrid(srcField, dstField, internal_state%routehandle_m2g, &
1386-
zeroregion=ESMF_REGION_SELECT, _RC)
1390+
termorderflag=ESMF_TERMORDER_SRCSEQ, zeroregion=ESMF_REGION_SELECT, _RC)
13871391

13881392
! get pointer to field on grid
13891393
call ESMF_FieldGet(dstField,farrayPtr=VAR_GRID,_RC)
@@ -1446,7 +1450,7 @@ subroutine tile_to_mesh(VAR_TILE,VAR_MESH,RC)
14461450
dstField=ESMF_FieldCreate(internal_state%mesh, array=meshArray, meshLoc=ESMF_MESHLOC_NODE, _RC)
14471451

14481452
! regrid from grid to mesh
1449-
call ESMF_FieldRegrid(srcField, dstField, internal_state%routehandle_g2m, _RC)
1453+
call ESMF_FieldRegrid(srcField, dstField, internal_state%routehandle_g2m, termorderflag=ESMF_TERMORDER_SRCSEQ, _RC)
14501454

14511455
! append halo values to end of "owned" array
14521456
call ESMF_FieldHalo(dstField, routehandle=internal_state%halohandle, _RC)

0 commit comments

Comments
 (0)