@@ -54,7 +54,9 @@ module atm_input_data
54
54
55
55
type (esmf_field), public :: u_input_grid ! < u/v wind at grid
56
56
type (esmf_field), public :: v_input_grid ! < box center
57
- type (esmf_field), public :: wind_input_grid ! < 3-component wind
57
+ type (esmf_field), public :: xwind_input_grid ! < x-component wind
58
+ type (esmf_field), public :: ywind_input_grid ! < y-component wind
59
+ type (esmf_field), public :: zwind_input_grid ! < z-component wind
58
60
type (esmf_field), allocatable , public :: tracers_input_grid(:) ! < tracers
59
61
60
62
integer , public :: lev_input ! < number of atmospheric layers
@@ -64,7 +66,7 @@ module atm_input_data
64
66
65
67
public :: read_input_atm_data
66
68
public :: cleanup_input_atm_data
67
- public :: convert_winds
69
+ public :: convert_winds_to_xyz
68
70
69
71
contains
70
72
@@ -150,15 +152,6 @@ subroutine init_atm_esmf_fields
150
152
151
153
print * ," - INITIALIZE ATMOSPHERIC ESMF FIELDS."
152
154
153
- print * ," - CALL FieldCreate FOR INPUT GRID 3-D WIND."
154
- wind_input_grid = ESMF_FieldCreate(input_grid, &
155
- typekind= ESMF_TYPEKIND_R8 , &
156
- staggerloc= ESMF_STAGGERLOC_CENTER, &
157
- ungriddedLBound= (/ 1 ,1 / ), &
158
- ungriddedUBound= (/ lev_input,3 / ), rc= rc)
159
- if (ESMF_logFoundError(rcToCheck= rc,msg= ESMF_LOGERR_PASSTHRU,line= __LINE__,file= __FILE__)) &
160
- call error_handler(" IN FieldCreate" , rc)
161
-
162
155
print * ," - CALL FieldCreate FOR INPUT GRID SURFACE PRESSURE."
163
156
ps_input_grid = ESMF_FieldCreate(input_grid, &
164
157
typekind= ESMF_TYPEKIND_R8 , &
@@ -173,6 +166,33 @@ subroutine init_atm_esmf_fields
173
166
if (ESMF_logFoundError(rcToCheck= rc,msg= ESMF_LOGERR_PASSTHRU,line= __LINE__,file= __FILE__)) &
174
167
call error_handler(" IN FieldCreate" , rc)
175
168
169
+ print * ," - CALL FieldCreate FOR INPUT GRID xwind."
170
+ xwind_input_grid = ESMF_FieldCreate(input_grid, &
171
+ typekind= ESMF_TYPEKIND_R8 , &
172
+ staggerloc= ESMF_STAGGERLOC_CENTER, &
173
+ ungriddedLBound= (/ 1 / ), &
174
+ ungriddedUBound= (/ lev_input/ ), rc= rc)
175
+ if (ESMF_logFoundError(rcToCheck= rc,msg= ESMF_LOGERR_PASSTHRU,line= __LINE__,file= __FILE__)) &
176
+ call error_handler(" IN FieldCreate" , rc)
177
+
178
+ print * ," - CALL FieldCreate FOR INPUT GRID ywind."
179
+ ywind_input_grid = ESMF_FieldCreate(input_grid, &
180
+ typekind= ESMF_TYPEKIND_R8 , &
181
+ staggerloc= ESMF_STAGGERLOC_CENTER, &
182
+ ungriddedLBound= (/ 1 / ), &
183
+ ungriddedUBound= (/ lev_input/ ), rc= rc)
184
+ if (ESMF_logFoundError(rcToCheck= rc,msg= ESMF_LOGERR_PASSTHRU,line= __LINE__,file= __FILE__)) &
185
+ call error_handler(" IN FieldCreate" , rc)
186
+
187
+ print * ," - CALL FieldCreate FOR INPUT GRID zwind."
188
+ zwind_input_grid = ESMF_FieldCreate(input_grid, &
189
+ typekind= ESMF_TYPEKIND_R8 , &
190
+ staggerloc= ESMF_STAGGERLOC_CENTER, &
191
+ ungriddedLBound= (/ 1 / ), &
192
+ ungriddedUBound= (/ lev_input/ ), rc= rc)
193
+ if (ESMF_logFoundError(rcToCheck= rc,msg= ESMF_LOGERR_PASSTHRU,line= __LINE__,file= __FILE__)) &
194
+ call error_handler(" IN FieldCreate" , rc)
195
+
176
196
print * ," - CALL FieldCreate FOR INPUT GRID TEMPERATURE."
177
197
temp_input_grid = ESMF_FieldCreate(input_grid, &
178
198
typekind= ESMF_TYPEKIND_R8 , &
@@ -408,7 +428,7 @@ subroutine read_input_atm_gfs_sigio_file(localpet)
408
428
! Convert from 2-d to 3-d component winds.
409
429
!- --------------------------------------------------------------------------
410
430
411
- call convert_winds
431
+ call convert_winds_to_xyz
412
432
413
433
!- --------------------------------------------------------------------------
414
434
! Compute 3-d pressure from 'ak' and 'bk'.
@@ -668,7 +688,7 @@ subroutine read_input_atm_gfs_gaussian_nemsio_file(localpet)
668
688
! Convert from 2-d to 3-d component winds.
669
689
!- --------------------------------------------------------------------------
670
690
671
- call convert_winds
691
+ call convert_winds_to_xyz
672
692
673
693
!- --------------------------------------------------------------------------
674
694
! Compute 3-d pressure from 'ak' and 'bk'.
@@ -933,7 +953,7 @@ subroutine read_input_atm_gaussian_nemsio_file(localpet)
933
953
! Convert from 2-d to 3-d component winds.
934
954
!- --------------------------------------------------------------------------
935
955
936
- call convert_winds
956
+ call convert_winds_to_xyz
937
957
938
958
!- --------------------------------------------------------------------------
939
959
! Compute 3-d pressure. Mid-layer and surface pressure are computed
@@ -1217,7 +1237,7 @@ subroutine read_input_atm_restart_file(localpet)
1217
1237
! Convert from 2-d to 3-d cartesian winds.
1218
1238
!- --------------------------------------------------------------------------
1219
1239
1220
- call convert_winds
1240
+ call convert_winds_to_xyz
1221
1241
1222
1242
!- --------------------------------------------------------------------------
1223
1243
! Compute pressures
@@ -1587,7 +1607,7 @@ subroutine read_input_atm_gaussian_netcdf_file(localpet)
1587
1607
! Convert from 2-d to 3-d cartesian winds.
1588
1608
!- --------------------------------------------------------------------------
1589
1609
1590
- call convert_winds
1610
+ call convert_winds_to_xyz
1591
1611
1592
1612
!- --------------------------------------------------------------------------
1593
1613
! Compute pressure.
@@ -1893,7 +1913,7 @@ subroutine read_input_atm_tiled_history_file(localpet)
1893
1913
! Convert from 2-d to 3-d cartesian winds.
1894
1914
!- --------------------------------------------------------------------------
1895
1915
1896
- call convert_winds
1916
+ call convert_winds_to_xyz
1897
1917
1898
1918
!- --------------------------------------------------------------------------
1899
1919
! Compute pressure.
@@ -2854,7 +2874,7 @@ subroutine read_input_atm_grib2_file(localpet)
2854
2874
! Convert from 2-d to 3-d component winds.
2855
2875
!- --------------------------------------------------------------------------
2856
2876
2857
- call convert_winds
2877
+ call convert_winds_to_xyz
2858
2878
2859
2879
!- --------------------------------------------------------------------------
2860
2880
! Convert dpdt to dzdt if needed
@@ -3089,25 +3109,39 @@ end subroutine read_winds
3089
3109
! > Convert winds from 2-d to 3-d components.
3090
3110
! !
3091
3111
! ! @author George Gayno NCEP/EMC
3092
- subroutine convert_winds
3112
+ subroutine convert_winds_to_xyz
3093
3113
3094
3114
implicit none
3095
3115
3096
- integer :: clb(4 ), cub(4 )
3116
+ integer :: clb(3 ), cub(3 )
3097
3117
integer :: i, j, k, rc
3098
3118
3099
3119
real (esmf_kind_r8 ) :: latrad, lonrad
3100
- real (esmf_kind_r8 ), pointer :: windptr(:,:,:,:)
3120
+ real (esmf_kind_r8 ), pointer :: xptr(:,:,:)
3121
+ real (esmf_kind_r8 ), pointer :: yptr(:,:,:)
3122
+ real (esmf_kind_r8 ), pointer :: zptr(:,:,:)
3101
3123
real (esmf_kind_r8 ), pointer :: uptr(:,:,:)
3102
3124
real (esmf_kind_r8 ), pointer :: vptr(:,:,:)
3103
3125
real (esmf_kind_r8 ), pointer :: latptr(:,:)
3104
3126
real (esmf_kind_r8 ), pointer :: lonptr(:,:)
3105
3127
3106
- print * ," - CALL FieldGet FOR 3-D WIND ."
3107
- call ESMF_FieldGet(wind_input_grid , &
3128
+ print * ," - CALL FieldGet FOR xwind ."
3129
+ call ESMF_FieldGet(xwind_input_grid , &
3108
3130
computationalLBound= clb, &
3109
3131
computationalUBound= cub, &
3110
- farrayPtr= windptr, rc= rc)
3132
+ farrayPtr= xptr, rc= rc)
3133
+ if (ESMF_logFoundError(rcToCheck= rc,msg= ESMF_LOGERR_PASSTHRU,line= __LINE__,file= __FILE__)) &
3134
+ call error_handler(" IN FieldGet" , rc)
3135
+
3136
+ print * ," - CALL FieldGet FOR ywind."
3137
+ call ESMF_FieldGet(ywind_input_grid, &
3138
+ farrayPtr= yptr, rc= rc)
3139
+ if (ESMF_logFoundError(rcToCheck= rc,msg= ESMF_LOGERR_PASSTHRU,line= __LINE__,file= __FILE__)) &
3140
+ call error_handler(" IN FieldGet" , rc)
3141
+
3142
+ print * ," - CALL FieldGet FOR zwind."
3143
+ call ESMF_FieldGet(zwind_input_grid, &
3144
+ farrayPtr= zptr, rc= rc)
3111
3145
if (ESMF_logFoundError(rcToCheck= rc,msg= ESMF_LOGERR_PASSTHRU,line= __LINE__,file= __FILE__)) &
3112
3146
call error_handler(" IN FieldGet" , rc)
3113
3147
@@ -3140,17 +3174,17 @@ subroutine convert_winds
3140
3174
latrad = latptr(i,j) * acos (- 1 .) / 180.0
3141
3175
lonrad = lonptr(i,j) * acos (- 1 .) / 180.0
3142
3176
do k = clb(3 ), cub(3 )
3143
- windptr (i,j,k, 1 ) = uptr(i,j,k) * cos (lonrad) - vptr(i,j,k) * sin (latrad) * sin (lonrad)
3144
- windptr (i,j,k, 2 ) = uptr(i,j,k) * sin (lonrad) + vptr(i,j,k) * sin (latrad) * cos (lonrad)
3145
- windptr (i,j,k, 3 ) = vptr(i,j,k) * cos (latrad)
3177
+ xptr (i,j,k) = uptr(i,j,k) * cos (lonrad) - vptr(i,j,k) * sin (latrad) * sin (lonrad)
3178
+ yptr (i,j,k) = uptr(i,j,k) * sin (lonrad) + vptr(i,j,k) * sin (latrad) * cos (lonrad)
3179
+ zptr (i,j,k) = vptr(i,j,k) * cos (latrad)
3146
3180
enddo
3147
3181
enddo
3148
3182
enddo
3149
3183
3150
3184
call ESMF_FieldDestroy(u_input_grid, rc= rc)
3151
3185
call ESMF_FieldDestroy(v_input_grid, rc= rc)
3152
3186
3153
- end subroutine convert_winds
3187
+ end subroutine convert_winds_to_xyz
3154
3188
3155
3189
! > Compute grid rotation angle for non-latlon grids.
3156
3190
! !
@@ -3257,7 +3291,9 @@ subroutine cleanup_input_atm_data
3257
3291
call ESMF_FieldDestroy(pres_input_grid, rc= rc)
3258
3292
call ESMF_FieldDestroy(dzdt_input_grid, rc= rc)
3259
3293
call ESMF_FieldDestroy(temp_input_grid, rc= rc)
3260
- call ESMF_FieldDestroy(wind_input_grid, rc= rc)
3294
+ call ESMF_FieldDestroy(xwind_input_grid, rc= rc)
3295
+ call ESMF_FieldDestroy(ywind_input_grid, rc= rc)
3296
+ call ESMF_FieldDestroy(zwind_input_grid, rc= rc)
3261
3297
call ESMF_FieldDestroy(ps_input_grid, rc= rc)
3262
3298
3263
3299
do n = 1 , num_tracers_input
0 commit comments