@@ -10,7 +10,7 @@ module med_map_mod
10
10
use med_utils_mod , only : chkerr = > med_utils_ChkErr
11
11
use perf_mod , only : t_startf, t_stopf
12
12
use shr_log_mod , only : shr_log_error
13
-
13
+
14
14
implicit none
15
15
private
16
16
@@ -299,7 +299,7 @@ end subroutine med_map_RouteHandles_initfrom_esmflds
299
299
subroutine med_map_routehandles_initfrom_fieldbundle (n1 , n2 , FBsrc , FBdst , mapindex , RouteHandle , rc )
300
300
301
301
use ESMF , only : ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS, ESMF_LogFlush
302
- use ESMF , only : ESMf_Field , ESMF_FieldBundle, ESMF_RouteHandle
302
+ use ESMF , only : ESMF_Field , ESMF_FieldBundle, ESMF_RouteHandle
303
303
use med_methods_mod , only : med_methods_FB_getFieldN
304
304
305
305
!- --------------------------------------------
@@ -361,7 +361,7 @@ subroutine med_map_routehandles_initfrom_field(n1, n2, fldsrc, flddst, mapindex,
361
361
use med_internalstate_mod , only : mapbilnr, mapconsf, mapconsd, mappatch, mappatch_uv3d, mapbilnr_uv3d, mapfcopy
362
362
use med_internalstate_mod , only : mapunset, mapnames, nmappers
363
363
use med_internalstate_mod , only : mapnstod, mapnstod_consd, mapnstod_consf, mapnstod_consd
364
- use med_internalstate_mod , only : mapfillv_bilnr, mapbilnr_nstod, mapconsf_aofrac
364
+ use med_internalstate_mod , only : mapfillv_bilnr, mapbilnr_nstod, mapconsf_aofrac, mapconsf_uv3d
365
365
use med_internalstate_mod , only : compocn, compwav, complnd, compname, compatm
366
366
use med_internalstate_mod , only : coupling_mode
367
367
use med_internalstate_mod , only : defaultMasks
@@ -467,121 +467,147 @@ subroutine med_map_routehandles_initfrom_field(n1, n2, fldsrc, flddst, mapindex,
467
467
ignoreUnmatchedIndices= .true. , &
468
468
srcTermProcessing= srcTermProcessing_Value, rc= rc)
469
469
if (chkerr(rc,__LINE__,u_FILE_u)) return
470
- else if (mapindex == mapbilnr .or. mapindex == mapbilnr_uv3d) then
471
- if (.not. ESMF_RouteHandleIsCreated(routehandles(mapbilnr))) then
470
+ else if (mapindex == mapbilnr ) then
472
471
if (maintask) then
473
472
write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
474
473
end if
475
474
call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mapbilnr), &
476
- srcMaskValues= (/ srcMaskValue/ ), &
477
- dstMaskValues= (/ dstMaskValue/ ), &
478
- regridmethod= ESMF_REGRIDMETHOD_BILINEAR, &
479
- polemethod= polemethod, &
475
+ srcMaskValues= (/ srcMaskValue/ ), &
476
+ dstMaskValues= (/ dstMaskValue/ ), &
477
+ regridmethod= ESMF_REGRIDMETHOD_BILINEAR, &
478
+ polemethod= polemethod, &
480
479
srcTermProcessing= srcTermProcessing_Value, &
481
- ignoreDegenerate= .true. , &
482
- dstStatusField= lfield, &
480
+ ignoreDegenerate= .true. , &
481
+ dstStatusField= lfield, &
483
482
unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, rc= rc)
484
483
if (chkerr(rc,__LINE__,u_FILE_u)) return
484
+ else if (mapindex == mapbilnr_uv3d ) then
485
+ if (maintask) then
486
+ write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
485
487
end if
488
+ call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mapbilnr_uv3d), &
489
+ srcMaskValues= (/ srcMaskValue/ ), &
490
+ dstMaskValues= (/ dstMaskValue/ ), &
491
+ regridmethod= ESMF_REGRIDMETHOD_BILINEAR, &
492
+ polemethod= polemethod, &
493
+ srcTermProcessing= srcTermProcessing_Value, &
494
+ ignoreDegenerate= .true. , &
495
+ dstStatusField= lfield, &
496
+ unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, rc= rc)
497
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
486
498
else if (mapindex == mapfillv_bilnr) then
487
499
if (maintask) then
488
500
write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
489
501
end if
490
502
call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mapfillv_bilnr), &
491
- srcMaskValues= (/ srcMaskValue/ ), &
492
- dstMaskValues= (/ dstMaskValue/ ), &
493
- regridmethod= ESMF_REGRIDMETHOD_BILINEAR, &
494
- polemethod= polemethod, &
503
+ srcMaskValues= (/ srcMaskValue/ ), &
504
+ dstMaskValues= (/ dstMaskValue/ ), &
505
+ regridmethod= ESMF_REGRIDMETHOD_BILINEAR, &
506
+ polemethod= polemethod, &
495
507
srcTermProcessing= srcTermProcessing_Value, &
496
- ignoreDegenerate= .true. , &
497
- dstStatusField= lfield, &
508
+ ignoreDegenerate= .true. , &
509
+ dstStatusField= lfield, &
498
510
unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, rc= rc)
499
511
if (chkerr(rc,__LINE__,u_FILE_u)) return
500
512
else if (mapindex == mapbilnr_nstod) then
501
513
if (maintask) then
502
514
write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
503
515
end if
504
516
call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mapbilnr_nstod), &
505
- srcMaskValues= (/ srcMaskValue/ ), &
506
- dstMaskValues= (/ dstMaskValue/ ), &
507
- regridmethod= ESMF_REGRIDMETHOD_BILINEAR, &
517
+ srcMaskValues= (/ srcMaskValue/ ), &
518
+ dstMaskValues= (/ dstMaskValue/ ), &
519
+ regridmethod= ESMF_REGRIDMETHOD_BILINEAR, &
508
520
extrapMethod= ESMF_EXTRAPMETHOD_NEAREST_STOD, &
509
- polemethod= polemethod, &
510
- srcTermProcessing= srcTermProcessing_Value, &
511
- ignoreDegenerate= .true. , &
512
- dstStatusField= lfield, &
521
+ polemethod= polemethod, &
522
+ srcTermProcessing= srcTermProcessing_Value, &
523
+ ignoreDegenerate= .true. , &
524
+ dstStatusField= lfield, &
513
525
unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, rc= rc)
514
526
if (chkerr(rc,__LINE__,u_FILE_u)) return
515
527
else if (mapindex == mapconsf .or. mapindex == mapnstod_consf) then
516
528
if (maintask) then
517
529
write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
518
530
end if
519
531
call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mapconsf), &
520
- srcMaskValues= (/ srcMaskValue/ ), &
521
- dstMaskValues= (/ dstMaskValue/ ), &
522
- regridmethod= ESMF_REGRIDMETHOD_CONSERVE, &
523
- normType= ESMF_NORMTYPE_FRACAREA, &
532
+ srcMaskValues= (/ srcMaskValue/ ), &
533
+ dstMaskValues= (/ dstMaskValue/ ), &
534
+ regridmethod= ESMF_REGRIDMETHOD_CONSERVE, &
535
+ normType= ESMF_NORMTYPE_FRACAREA, &
524
536
srcTermProcessing= srcTermProcessing_Value, &
525
- ignoreDegenerate= .true. , &
526
- dstStatusField= lfield, &
527
- unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, &
528
- rc= rc)
537
+ ignoreDegenerate= .true. , &
538
+ dstStatusField= lfield, &
539
+ unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, rc= rc)
529
540
if (chkerr(rc,__LINE__,u_FILE_u)) return
530
541
else if (mapindex == mapconsf_aofrac) then
531
- if (.not. ESMF_RouteHandleIsCreated(routehandles(mapconsf))) then
532
- if (maintask) then
533
- write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
534
- end if
535
- call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mapconsf_aofrac), &
536
- srcMaskValues= (/ srcMaskValue/ ), &
537
- dstMaskValues= (/ dstMaskValue/ ), &
538
- regridmethod= ESMF_REGRIDMETHOD_CONSERVE, &
539
- normType= ESMF_NORMTYPE_FRACAREA, &
540
- srcTermProcessing= srcTermProcessing_Value, &
541
- ignoreDegenerate= .true. , &
542
- dstStatusField= lfield, &
543
- unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, &
544
- rc= rc)
545
- if (chkerr(rc,__LINE__,u_FILE_u)) return
546
- else
547
- ! Copy existing consf RH
548
- if (maintask) then
549
- write (logunit,' (A)' ) trim (subname)// ' copying RH(mapconsf) to ' // trim (mapname)// ' for ' // trim (string)
550
- end if
551
- routehandles(mapconsf_aofrac) = ESMF_RouteHandleCreate(routehandles(mapconsf), rc= rc)
552
- if (chkerr(rc,__LINE__,u_FILE_u)) return
542
+ if (maintask) then
543
+ write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
553
544
end if
545
+ call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mapconsf_aofrac), &
546
+ srcMaskValues= (/ srcMaskValue/ ), &
547
+ dstMaskValues= (/ dstMaskValue/ ), &
548
+ regridmethod= ESMF_REGRIDMETHOD_CONSERVE, &
549
+ normType= ESMF_NORMTYPE_FRACAREA, &
550
+ srcTermProcessing= srcTermProcessing_Value, &
551
+ ignoreDegenerate= .true. , &
552
+ dstStatusField= lfield, &
553
+ unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, rc= rc)
554
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
555
+ else if (mapindex == mapconsf_uv3d) then
556
+ if (maintask) then
557
+ write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
558
+ end if
559
+ call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mapconsf_uv3d), &
560
+ srcMaskValues= (/ srcMaskValue/ ), &
561
+ dstMaskValues= (/ dstMaskValue/ ), &
562
+ regridmethod= ESMF_REGRIDMETHOD_CONSERVE, &
563
+ normType= ESMF_NORMTYPE_FRACAREA, &
564
+ srcTermProcessing= srcTermProcessing_Value, &
565
+ ignoreDegenerate= .true. , &
566
+ dstStatusField= lfield, &
567
+ unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, rc= rc)
568
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
554
569
else if (mapindex == mapconsd .or. mapindex == mapnstod_consd) then
555
570
if (maintask) then
556
571
write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
557
572
end if
558
573
call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mapconsd), &
559
- srcMaskValues= (/ srcMaskValue/ ), &
560
- dstMaskValues= (/ dstMaskValue/ ), &
561
- regridmethod= ESMF_REGRIDMETHOD_CONSERVE, &
562
- normType= ESMF_NORMTYPE_DSTAREA, &
574
+ srcMaskValues= (/ srcMaskValue/ ), &
575
+ dstMaskValues= (/ dstMaskValue/ ), &
576
+ regridmethod= ESMF_REGRIDMETHOD_CONSERVE, &
577
+ normType= ESMF_NORMTYPE_DSTAREA, &
563
578
srcTermProcessing= srcTermProcessing_Value, &
564
- ignoreDegenerate= .true. , &
565
- dstStatusField= lfield, &
566
- unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, &
567
- rc= rc)
579
+ ignoreDegenerate= .true. , &
580
+ dstStatusField= lfield, &
581
+ unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, rc= rc)
568
582
if (chkerr(rc,__LINE__,u_FILE_u)) return
569
- else if (mapindex == mappatch .or. mapindex == mappatch_uv3d) then
570
- if (.not. ESMF_RouteHandleIsCreated(routehandles(mappatch))) then
571
- if (maintask) then
572
- write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
573
- end if
574
- call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mappatch), &
575
- srcMaskValues= (/ srcMaskValue/ ), &
576
- dstMaskValues= (/ dstMaskValue/ ), &
577
- regridmethod= ESMF_REGRIDMETHOD_PATCH, &
578
- polemethod= polemethod, &
579
- srcTermProcessing= srcTermProcessing_Value, &
580
- ignoreDegenerate= .true. , &
581
- dstStatusField= lfield, &
582
- unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, rc= rc)
583
- if (chkerr(rc,__LINE__,u_FILE_u)) return
583
+ else if (mapindex == mappatch ) then
584
+ if (maintask) then
585
+ write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
584
586
end if
587
+ call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mappatch), &
588
+ srcMaskValues= (/ srcMaskValue/ ), &
589
+ dstMaskValues= (/ dstMaskValue/ ), &
590
+ regridmethod= ESMF_REGRIDMETHOD_PATCH, &
591
+ polemethod= polemethod, &
592
+ srcTermProcessing= srcTermProcessing_Value, &
593
+ ignoreDegenerate= .true. , &
594
+ dstStatusField= lfield, &
595
+ unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, rc= rc)
596
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
597
+ else if (mapindex == mappatch_uv3d ) then
598
+ if (maintask) then
599
+ write (logunit,' (A)' ) trim (subname)// ' creating RH ' // trim (mapname)// ' for ' // trim (string)
600
+ end if
601
+ call ESMF_FieldRegridStore(fldsrc, flddst, routehandle= routehandles(mappatch_uv3d), &
602
+ srcMaskValues= (/ srcMaskValue/ ), &
603
+ dstMaskValues= (/ dstMaskValue/ ), &
604
+ regridmethod= ESMF_REGRIDMETHOD_PATCH, &
605
+ polemethod= polemethod, &
606
+ srcTermProcessing= srcTermProcessing_Value, &
607
+ ignoreDegenerate= .true. , &
608
+ dstStatusField= lfield, &
609
+ unmappedaction= ESMF_UNMAPPEDACTION_IGNORE, rc= rc)
610
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
585
611
else
586
612
call shr_log_error(trim (subname)// ' mapindex ' // trim (mapname)// ' not supported for ' // trim (string), &
587
613
line= __LINE__, file= u_FILE_u, rc= rc)
@@ -922,7 +948,7 @@ subroutine med_map_field_packed(FBSrc, FBDst, FBFracSrc, FBDat, use_data, field_
922
948
use ESMF , only : ESMF_KIND_R8
923
949
use ESMF , only : ESMF_Region_Flag, ESMF_REGION_SELECT, ESMF_REGION_TOTAL
924
950
use med_internalstate_mod , only : nmappers, mapfcopy
925
- use med_internalstate_mod , only : mappatch_uv3d, mappatch, mapbilnr_uv3d, mapbilnr
951
+ use med_internalstate_mod , only : mappatch_uv3d, mappatch, mapbilnr_uv3d, mapconsf_uv3d, mapbilnr
926
952
use med_internalstate_mod , only : packed_data_type
927
953
use med_methods_mod , only : Field_diagnose = > med_methods_Field_diagnose
928
954
@@ -1005,15 +1031,18 @@ subroutine med_map_field_packed(FBSrc, FBDst, FBFracSrc, FBDat, use_data, field_
1005
1031
if (mapindex == mappatch_uv3d) then
1006
1032
1007
1033
! For mappatch_uv3d do not use packed field bundles
1008
- call med_map_uv_cart3d(FBsrc, FBdst, routehandles, mappatch , rc= rc)
1034
+ call med_map_uv_cart3d(FBsrc, FBdst, routehandles, mappatch_uv3d , rc= rc)
1009
1035
if (chkerr(rc,__LINE__,u_FILE_u)) return
1010
1036
1011
1037
else if (mapindex == mapbilnr_uv3d) then
1012
1038
1013
1039
! For mapbilnr_uv3d do not use packed field bundles
1014
- call med_map_uv_cart3d(FBsrc, FBdst, routehandles, mapbilnr , rc= rc)
1040
+ call med_map_uv_cart3d(FBsrc, FBdst, routehandles, mapbilnr_uv3d , rc= rc)
1015
1041
if (chkerr(rc,__LINE__,u_FILE_u)) return
1016
1042
1043
+ ! For mapconsf_uv3d do not use packed field bundles
1044
+ call med_map_uv_cart3d(FBsrc, FBdst, routehandles, mapconsf_uv3d, map_stress= .true. , rc= rc)
1045
+ if (chkerr(rc,__LINE__,u_FILE_u)) return
1017
1046
else
1018
1047
1019
1048
! -----------------------------------
@@ -1454,7 +1483,7 @@ subroutine med_map_field(field_src, field_dst, routehandles, maptype, fldname, z
1454
1483
end subroutine med_map_field
1455
1484
1456
1485
! ================================================================================
1457
- subroutine med_map_uv_cart3d (FBsrc , FBdst , routehandles , mapindex , rc )
1486
+ subroutine med_map_uv_cart3d (FBsrc , FBdst , routehandles , mapindex , map_stress , rc )
1458
1487
1459
1488
use ESMF , only : ESMF_Mesh, ESMF_MeshGet, ESMF_MESHLOC_ELEMENT, ESMF_TYPEKIND_R8
1460
1489
use ESMF , only : ESMF_Field, ESMF_FieldCreate, ESMF_FieldGet
@@ -1467,6 +1496,7 @@ subroutine med_map_uv_cart3d(FBsrc, FBdst, routehandles, mapindex, rc)
1467
1496
type (ESMF_FieldBundle) , intent (inout ) :: FBdst
1468
1497
type (ESMF_RouteHandle) , intent (inout ) :: routehandles(:)
1469
1498
integer , intent (in ) :: mapindex
1499
+ logical , optional , intent (in ) :: map_stress
1470
1500
integer , intent (out ) :: rc
1471
1501
1472
1502
! local variables
@@ -1493,22 +1523,39 @@ subroutine med_map_uv_cart3d(FBsrc, FBdst, routehandles, mapindex, rc)
1493
1523
integer :: spatialDim
1494
1524
real (r8 ), parameter :: deg2rad = shr_const_pi/ 180.0_R8 ! deg to rads
1495
1525
logical :: first_time = .true.
1526
+ logical :: lmap_stress
1527
+ character (len= CS) :: uname, vname
1496
1528
character (len=* ), parameter :: subname= ' (med_map_mod:med_map_uv_cart3d) '
1497
1529
!- ------------------------------------------------------------------------------
1498
1530
1499
1531
rc = ESMF_SUCCESS
1500
1532
1533
+ lmap_stress = .false.
1534
+ if (present (map_stress)) then
1535
+ lmap_stress = map_stress
1536
+ end if
1537
+
1538
+ if (lmap_stress) then
1539
+ ! Get fields for atm zonal and merid stresses
1540
+ uname = ' Faxa_taux'
1541
+ vname = ' Faxa_tauy'
1542
+ else
1543
+ ! Get fields for atm u,v velocities
1544
+ uname = ' Sa_u'
1545
+ vname = ' Sa_v'
1546
+ end if
1547
+
1501
1548
! Get fields for atm u,v velocities
1502
- call ESMF_FieldBundleGet(FBSrc, fieldName= ' Sa_u ' , field= usrc, rc= rc)
1549
+ call ESMF_FieldBundleGet(FBSrc, fieldName= trim (uname) , field= usrc, rc= rc)
1503
1550
if (chkerr(rc,__LINE__,u_FILE_u)) return
1504
- call ESMF_FieldBundleGet(FBDst, fieldName= ' Sa_u ' , field= udst, rc= rc)
1551
+ call ESMF_FieldBundleGet(FBDst, fieldName= trim (uname) , field= udst, rc= rc)
1505
1552
if (chkerr(rc,__LINE__,u_FILE_u)) return
1506
- call ESMF_FieldBundleGet(FBSrc, fieldName= ' Sa_v ' , field= vsrc, rc= rc)
1553
+ call ESMF_FieldBundleGet(FBSrc, fieldName= trim (vname) , field= vsrc, rc= rc)
1507
1554
if (chkerr(rc,__LINE__,u_FILE_u)) return
1508
- call ESMF_FieldBundleGet(FBDst, fieldName= ' Sa_v ' , field= vdst, rc= rc)
1555
+ call ESMF_FieldBundleGet(FBDst, fieldName= trim (vname) , field= vdst, rc= rc)
1509
1556
if (chkerr(rc,__LINE__,u_FILE_u)) return
1510
1557
1511
- ! GET pointer to input u and v data source field data
1558
+ ! Get pointer to input u and v data source field data
1512
1559
call ESMF_FieldGet(usrc, farrayPtr= data_u_src, rc= rc)
1513
1560
if (chkerr(rc,__LINE__,u_FILE_u)) return
1514
1561
call ESMF_FieldGet(vsrc, farrayPtr= data_v_src, rc= rc)
0 commit comments