From c95b935c5da2149501711e8c4982519771e10a4b Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Fri, 11 Jun 2021 10:57:11 -0600 Subject: [PATCH 1/3] validation bug fixes --- mediator/esmFldsExchange_cesm_mod.F90 | 2 +- mediator/fd_cesm.yaml | 4 ++++ mediator/med.F90 | 19 +++++++++++++++--- mediator/med_internalstate_mod.F90 | 1 + mediator/med_phases_history_mod.F90 | 12 ++++++++++- mediator/med_phases_prep_atm_mod.F90 | 29 +++++++++++++++++++++++++++ 6 files changed, 62 insertions(+), 5 deletions(-) diff --git a/mediator/esmFldsExchange_cesm_mod.F90 b/mediator/esmFldsExchange_cesm_mod.F90 index 8253fe951..d01ce7465 100644 --- a/mediator/esmFldsExchange_cesm_mod.F90 +++ b/mediator/esmFldsExchange_cesm_mod.F90 @@ -1979,7 +1979,7 @@ subroutine esmFldsExchange_cesm(gcomp, phase, rc) call addfld(fldListFr(compocn)%flds, 'Faoo_fco2_ocn') call addfld(fldListTo(compatm)%flds, 'Faoo_fco2_ocn') else - call addmap(fldListFr(compocn)%flds, 'Faoo_fco2_ocn', compatm, mapconsf, 'one', ocn2atm_fmap) + call addmap(fldListFr(compocn)%flds, 'Faoo_fco2_ocn', compatm, mapconsd, 'one', ocn2atm_fmap) ! custom merge in med_phases_prep_atm end if endif diff --git a/mediator/fd_cesm.yaml b/mediator/fd_cesm.yaml index ab4c5cd9a..1a4889bc0 100644 --- a/mediator/fd_cesm.yaml +++ b/mediator/fd_cesm.yaml @@ -43,6 +43,10 @@ canonical_units: N m-2 description: mediator export # + - standard_name: area + canonical_units: radians**2 + description: mediator area for component + # #----------------------------------- # section: land export #----------------------------------- diff --git a/mediator/med.F90 b/mediator/med.F90 index 2ced7ad41..fe90f26ee 100644 --- a/mediator/med.F90 +++ b/mediator/med.F90 @@ -664,7 +664,7 @@ subroutine InitializeIPDv03p1(gcomp, importState, exportState, clock, rc) ! TransferOfferGeomObject Attribute. use ESMF , only : ESMF_GridComp, ESMF_State, ESMF_Clock, ESMF_SUCCESS, ESMF_LogFoundAllocError - use ESMF , only : ESMF_StateIsCreated + use ESMF , only : ESMF_StateIsCreated use ESMF , only : ESMF_LogMsg_Info, ESMF_LogWrite use ESMF , only : ESMF_END_ABORT, ESMF_Finalize use NUOPC , only : NUOPC_AddNamespace, NUOPC_Advertise, NUOPC_AddNestedState @@ -2022,7 +2022,7 @@ subroutine DataInitialize(gcomp, rc) ! Create mesh info data call med_meshinfo_create(is_local%wrap%FBImp(n1,n1), & - is_local%wrap%mesh_info(n1), rc=rc) + is_local%wrap%mesh_info(n1), is_local%wrap%FBArea(n1), rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return end if @@ -2580,17 +2580,19 @@ end subroutine SetRunClock !----------------------------------------------------------------------------- - subroutine med_meshinfo_create(FB, mesh_info, rc) + subroutine med_meshinfo_create(FB, mesh_info, FBArea, rc) use ESMF , only : ESMF_Array, ESMF_ArrayCreate, ESMF_ArrayDestroy, ESMF_Field, ESMF_FieldGet use ESMF , only : ESMF_DistGrid, ESMF_FieldBundle, ESMF_FieldRegridGetArea, ESMF_FieldBundleGet use ESMF , only : ESMF_Mesh, ESMF_MeshGet, ESMF_MESHLOC_ELEMENT, ESMF_TYPEKIND_R8 use ESMF , only : ESMF_SUCCESS, ESMF_FAILURE, ESMF_LogWrite, ESMF_LOGMSG_INFO + use ESMF , only : ESMF_FieldCreate, ESMF_FieldBundleCreate, ESMF_FieldBundleAdd use med_internalstate_mod , only : mesh_info_type ! input/output variables type(ESMF_FieldBundle) , intent(in) :: FB type(mesh_info_type) , intent(inout) :: mesh_info + type(ESMF_FieldBundle) , intent(inout) :: FBArea integer , intent(out) :: rc ! local variables @@ -2641,6 +2643,17 @@ subroutine med_meshinfo_create(FB, mesh_info, rc) end do deallocate(ownedElemCoords) + ! Create field bundle with areas so that this can be output to mediator history file + lfield = ESMF_FieldCreate(lmesh, ESMF_TYPEKIND_r8, name='area', meshloc=ESMF_MESHLOC_ELEMENT, rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + FBArea = ESMF_FieldBundleCreate(rc=rc) + if (ChkErr(rc,__LINE__,u_FILE_u)) return + call ESMF_FieldBundleAdd(FBArea, (/lfield/), rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + call ESMF_FieldGet(lfield, farrayPtr=dataptr, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + dataptr(:) = mesh_info%areas(:) + end subroutine med_meshinfo_create !----------------------------------------------------------------------------- diff --git a/mediator/med_internalstate_mod.F90 b/mediator/med_internalstate_mod.F90 index 7ca821d3c..9891d9ce7 100644 --- a/mediator/med_internalstate_mod.F90 +++ b/mediator/med_internalstate_mod.F90 @@ -98,6 +98,7 @@ module med_internalstate_mod ! Component Mesh info type(mesh_info_type) :: mesh_info(ncomps) + type(ESMF_FieldBundle) :: FBArea(ncomps) ! needed for mediator history writes end type InternalStateStruct diff --git a/mediator/med_phases_history_mod.F90 b/mediator/med_phases_history_mod.F90 index 7cfe09b57..7a8c4f62b 100644 --- a/mediator/med_phases_history_mod.F90 +++ b/mediator/med_phases_history_mod.F90 @@ -409,6 +409,7 @@ subroutine med_phases_history_write(gcomp, rc) nx=nx, ny=ny, nt=1, whead=whead, wdata=wdata, pre=trim(compname(n))//'Exp', rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return endif + ! write component mediator fractions if (ESMF_FieldBundleIsCreated(is_local%wrap%FBFrac(n),rc=rc)) then nx = is_local%wrap%nx(n) ny = is_local%wrap%ny(n) @@ -416,7 +417,12 @@ subroutine med_phases_history_write(gcomp, rc) nx=nx, ny=ny, nt=1, whead=whead, wdata=wdata, pre='Med_frac_'//trim(compname(n)), rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return end if - endif + ! write component mediator areas + nx = is_local%wrap%nx(n) + ny = is_local%wrap%ny(n) + call med_io_write(hist_file, iam, is_local%wrap%FBArea(n), & + nx=nx, ny=ny, nt=1, whead=whead, wdata=wdata, pre='MED_'//trim(compname(n)), rc=rc) + end if enddo if (ESMF_FieldBundleIsCreated(is_local%wrap%FBMed_ocnalb_o,rc=rc)) then nx = is_local%wrap%nx(compocn) @@ -453,6 +459,10 @@ subroutine med_phases_history_write(gcomp, rc) end if enddo + ! Write out areas to history file + do n = 1,ncomps + end do + call med_io_close(hist_file, iam, rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return diff --git a/mediator/med_phases_prep_atm_mod.F90 b/mediator/med_phases_prep_atm_mod.F90 index ba1a18962..e26f3b5f1 100644 --- a/mediator/med_phases_prep_atm_mod.F90 +++ b/mediator/med_phases_prep_atm_mod.F90 @@ -44,6 +44,8 @@ subroutine med_phases_prep_atm(gcomp, rc) type(InternalState) :: is_local real(R8), pointer :: dataPtr1(:) => null() real(R8), pointer :: dataPtr2(:) => null() + real(R8), pointer :: ifrac(:) => null() + real(R8), pointer :: ofrac(:) => null() integer :: i, j, n, n1, ncnt character(len=*),parameter :: subname='(med_phases_prep_atm)' !------------------------------------------------------------------------------- @@ -190,6 +192,33 @@ subroutine med_phases_prep_atm(gcomp, rc) end do end if + ! Note - the following needs a custom merge since Faoo_fco2_ocn is scaled by (ifrac+ofrac) + ! in the merge to the atm + if ( FB_FldChk(is_local%wrap%FBExp(compatm) , 'Faoo_fco2_ocn', rc=rc) .and. & + FB_FldChk(is_local%wrap%FBImp(compocn,compocn), 'Faoo_fco2_ocn', rc=rc)) then + call ESMF_FieldGet(lfield, farrayPtr=dataptr1, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + call ESMF_FieldBundleGet(is_local%wrap%FBFrac(compatm), fieldName='ifrac', field=lfield, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + call ESMF_FieldGet(lfield, farrayPtr=ifrac, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + call ESMF_FieldBundleGet(is_local%wrap%FBFrac(compatm), fieldName='ofrac', field=lfield, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + call ESMF_FieldGet(lfield, farrayPtr=ofrac, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + call ESMF_FieldBundleGet(is_local%wrap%FBImp(compocn,compatm), fieldName='Faoo_fco2_ocn', field=lfield, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + call ESMF_FieldGet(lfield, farrayPtr=dataptr1, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + call ESMF_FieldBundleGet(is_local%wrap%FBExp(compatm), fieldName='Faoo_fco2_ocn', field=lfield, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + call ESMF_FieldGet(lfield, farrayPtr=dataptr2, rc=rc) + if (chkerr(rc,__LINE__,u_FILE_u)) return + do n = 1,size(dataptr2) + dataptr2(n) = (ifrac(n) + ofrac(n)) * dataptr1(n) + end do + end if + if (dbug_flag > 5) then call ESMF_LogWrite(trim(subname)//": done", ESMF_LOGMSG_INFO) end if From d5b824646d3d1e3973f8dfb00335c25624bdc9b7 Mon Sep 17 00:00:00 2001 From: Mariana Vertenstein Date: Mon, 14 Jun 2021 16:10:37 -0600 Subject: [PATCH 2/3] removed extraneous do loop --- mediator/med_phases_history_mod.F90 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/mediator/med_phases_history_mod.F90 b/mediator/med_phases_history_mod.F90 index 7a8c4f62b..893393d2c 100644 --- a/mediator/med_phases_history_mod.F90 +++ b/mediator/med_phases_history_mod.F90 @@ -459,10 +459,6 @@ subroutine med_phases_history_write(gcomp, rc) end if enddo - ! Write out areas to history file - do n = 1,ncomps - end do - call med_io_close(hist_file, iam, rc=rc) if (ChkErr(rc,__LINE__,u_FILE_u)) return From 65045d27a0e8476260734910b08b0e2581c56a45 Mon Sep 17 00:00:00 2001 From: Jim Edwards Date: Tue, 15 Jun 2021 07:13:54 -0600 Subject: [PATCH 3/3] change this from INFO to ERROR --- mediator/med_map_mod.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mediator/med_map_mod.F90 b/mediator/med_map_mod.F90 index ee9371550..e1dab5e84 100644 --- a/mediator/med_map_mod.F90 +++ b/mediator/med_map_mod.F90 @@ -817,7 +817,7 @@ subroutine med_map_packed_field_create(destcomp, flds_scalar_name, & //', mapnorm '//trim(mapnorm_mapindex) & //' set; cannot set mapnorm to '//trim(packed_data(mapindex)%mapnorm) & //' '//trim(fieldnamelist(nf)) - call ESMF_LogWrite(trim(tmpstr), ESMF_LOGMSG_INFO) + call ESMF_LogWrite(trim(tmpstr), ESMF_LOGMSG_ERROR) call ESMF_Finalize(endflag=ESMF_END_ABORT) end if end if @@ -989,7 +989,7 @@ subroutine med_map_field_packed(FBSrc, FBDst, FBFracSrc, field_normOne, packed_d ! ----------------------------------- ! Copy the src fields into the packed field bundle ! ----------------------------------- - + call t_startf('MED:'//trim(subname)//' copy from src') ! First get the pointer for the packed source data