merge standard release WRF/WPS V3.0.1.1 into wrffire
[wrffire.git] / wrfv2_fire / share / wrf_ext_write_field.F
blob4d48aafa7fe466a0562f868f38ec4c1b57b8ba8d
1 !WRF:MEDIATION:IO
2   SUBROUTINE wrf_ext_write_field(DataHandle,DateStr,Var,Field,FieldType,Comm,IOComm, &
3                                  DomainDesc,                      &
4                                  bdy_mask   ,                     &
5                                  dryrun        ,                  &
6                                  MemoryOrder,                     &
7                                  Stagger,                         &
8                                  Dimname1, Dimname2, Dimname3 ,   &
9                                  Desc, Units,                     &
10                                  debug_message ,                              &
11                                  ds1, de1, ds2, de2, ds3, de3,                &
12                                  ms1, me1, ms2, me2, ms3, me3,                &
13                                  ps1, pe1, ps2, pe2, ps3, pe3, Status          )
14     USE module_io
15     USE module_wrf_error
16     USE module_state_description
17     USE module_timing
18     IMPLICIT NONE
20     INTEGER       itrace
21     integer                                      :: DataHandle
22     character*(*)                                :: DateStr
23     character*(*)                                :: Var
24     integer                                      :: Field(*)
25     integer                                      :: FieldType
26     integer                                      :: Comm
27     integer                                      :: IOComm
28     integer                                      :: DomainDesc
29     logical                                      :: dryrun
30     character*(*)                                :: MemoryOrder
31     logical, dimension(4)                        :: bdy_mask
32     character*(*)                                :: Stagger
33     character*(*)                                :: Dimname1, Dimname2, Dimname3
34     character*(*)                                :: Desc, Units
35     character*(*)                                :: debug_message
37     INTEGER ,       INTENT(IN   ) :: ds1, de1, ds2, de2, ds3, de3, &
38                                      ms1, me1, ms2, me2, ms3, me3, &
39                                      ps1, pe1, ps2, pe2, ps3, pe3
41     
42     INTEGER , DIMENSION(3) :: domain_start , domain_end
43     INTEGER , DIMENSION(3) :: memory_start , memory_end
44     INTEGER , DIMENSION(3) :: patch_start , patch_end
45     CHARACTER*80 , DIMENSION(3) :: dimnames
47     integer                       ,intent(inout)   :: Status
48     LOGICAL for_out, horiz_stagger
49     INTEGER Hndl, io_form
50     LOGICAL, EXTERNAL :: has_char
51     INTEGER, EXTERNAL :: use_package
53     IF ( wrf_at_debug_level( 500 ) ) THEN
54       call start_timing
55     ENDIF
56     domain_start(1) = ds1 ; domain_end(1) = de1 ;
57     patch_start(1)  = ps1 ; patch_end(1)  = pe1 ;
58     memory_start(1) = ms1 ; memory_end(1) = me1 ;
59     domain_start(2) = ds2 ; domain_end(2) = de2 ;
60     patch_start(2)  = ps2 ; patch_end(2)  = pe2 ;
61     memory_start(2) = ms2 ; memory_end(2) = me2 ;
62     domain_start(3) = ds3 ; domain_end(3) = de3 ;
63     patch_start(3)  = ps3 ; patch_end(3)  = pe3 ;
64     memory_start(3) = ms3 ; memory_end(3) = me3 ;
66     dimnames(1) = Dimname1
67     dimnames(2) = Dimname2
68     dimnames(3) = Dimname3
70     CALL debug_io_wrf ( debug_message,DateStr,                          &
71                         domain_start,domain_end,patch_start,patch_end,  &
72                         memory_start,memory_end                          )
73 #if 0
74     Status = 1
75     if ( de1 - ds1 < 0 ) return
76     if ( de2 - ds2 < 0 ) return
77     if ( de3 - ds3 < 0 ) return
78     if ( pe1 - ps1 < 0 ) return
79     if ( pe2 - ps2 < 0 ) return
80     if ( pe3 - ps3 < 0 ) return
81     if ( me1 - ms1 < 0 ) return
82     if ( me2 - ms2 < 0 ) return
83     if ( me3 - ms3 < 0 ) return
84 #endif
85     Status = 0
88     CALL wrf_write_field (   &
89                        DataHandle                 &  ! DataHandle
90                       ,DateStr                    &  ! DateStr
91                       ,Var                        &  ! Data Name
92                       ,Field                      &  ! Field
93                       ,FieldType                  &  ! FieldType
94                       ,Comm                       &  ! Comm
95                       ,IOComm                     &  ! IOComm
96                       ,DomainDesc                 &  ! DomainDesc
97                       ,bdy_mask                   &  ! bdy_mask
98                       ,MemoryOrder                &  ! MemoryOrder
99                       ,Stagger                    &  ! JMMODS 010620
100                       ,dimnames                   &  ! JMMODS 001109
101                       ,domain_start               &  ! DomainStart
102                       ,domain_end                 &  ! DomainEnd
103                       ,memory_start               &  ! MemoryStart
104                       ,memory_end                 &  ! MemoryEnd
105                       ,patch_start                &  ! PatchStart
106                       ,patch_end                  &  ! PatchEnd
107                       ,Status )
109     CALL get_handle ( Hndl, io_form , for_out, DataHandle )
111     IF ( ( dryrun .AND. ( use_package(io_form) .EQ. IO_NETCDF .OR. &
112                           use_package(io_form) .EQ. IO_PNETCDF ) ) .OR. &
113                         ( use_package(io_form) .EQ. IO_PHDF5  )   ) THEN
115       CALL wrf_put_var_ti_char( &
116                        DataHandle                 &  ! DataHandle
117                       ,"description"              &  ! Element
118                       ,Var                        &  ! Data Name
119                       ,Desc                       &  ! Data
120                       ,Status )
121       CALL wrf_put_var_ti_char( &
122                        DataHandle                 &  ! DataHandle
123                       ,"units"                    &  ! Element
124                       ,Var                        &  ! Data Name
125                       ,Units                      &  ! Data
126                       ,Status )
127       CALL wrf_put_var_ti_char( &
128                        DataHandle                 &  ! DataHandle
129                       ,"stagger"                  &  ! Element
130                       ,Var                        &  ! Data Name
131                       ,Stagger                    &  ! Data
132                       ,Status )
133 #if (EM_CORE == 1)
134 ! TBH:  Added "coordinates" metadata for GIS folks in RAL.  It is a step 
135 ! TBH:  towards CF.  This change was requested by Jennifer Boehnert based 
136 ! TBH:  upon a suggestion from Nawajish Noman.  
137 ! TBH:  TODO:  This code depends upon longitude and latitude arrays being 
138 ! TBH:         named "XLONG", "XLAT", "XLONG_U", "XLAT_U", "XLONG_V", and 
139 ! TBH:         "XLAT_V" for EM_CORE.  We need a more general way to handle 
140 ! TBH:         this, possibly via the Registry.  
141 ! TBH:  TODO:  Leave this on all the time or make it namelist-selectable?  
142 ! TBH:  TODO:  Use dimnames(*) == south_north || west_east instead of 
143 ! TBH:         MemoryOrder and Stagger?  It would also work for both ARW 
144 ! TBH:         and NMM and be easier to handle via Registry...  
145 !      IF ( ( ( MemoryOrder(1:2) == 'XY' ) .OR. &
146 !             ( MemoryOrder(1:3) == 'XZY' ) ) .AND. &
147 !           ( Var(1:5) /= 'XLONG' ) .AND. &
148 !           ( Var(1:4) /= 'XLAT'  ) ) THEN
149 ! JM used trim instead, to avoid spurious errors when bounds checking on
150       IF ( ( ( TRIM(MemoryOrder) == 'XY' ) .OR. &
151              ( TRIM(MemoryOrder) == 'XZY' ) .OR. &
152              ( TRIM(MemoryOrder) == 'XYZ' ) ) .AND. &
153            ( TRIM(Var) /= 'XLONG' ) .AND. &
154            ( TRIM(Var) /= 'XLAT'  ) ) THEN
155         horiz_stagger = .FALSE.
156         IF ( LEN_TRIM(Stagger) == 1 ) THEN
157           IF ( has_char( Stagger, 'x' ) ) THEN
158             horiz_stagger = .TRUE.
159             CALL wrf_put_var_ti_char( &
160                              DataHandle                 &  ! DataHandle
161                             ,"coordinates"              &  ! Element
162                             ,Var                        &  ! Data Name
163                             ,"XLONG_U XLAT_U"           &  ! Data
164                             ,Status )
165           ELSE IF ( has_char( Stagger, 'y' ) ) THEN
166             horiz_stagger = .TRUE.
167             CALL wrf_put_var_ti_char( &
168                              DataHandle                 &  ! DataHandle
169                             ,"coordinates"              &  ! Element
170                             ,Var                        &  ! Data Name
171                             ,"XLONG_V XLAT_V"           &  ! Data
172                             ,Status )
173           ENDIF
174         ENDIF
175         IF ( .NOT. horiz_stagger ) THEN
176           CALL wrf_put_var_ti_char( &
177                            DataHandle                 &  ! DataHandle
178                           ,"coordinates"              &  ! Element
179                           ,Var                        &  ! Data Name
180                           ,"XLONG XLAT"               &  ! Data
181                           ,Status )
182         ENDIF
183       ENDIF
184 #endif
185     ENDIF
187     IF ( wrf_at_debug_level(300) ) THEN
188       WRITE(wrf_err_message,*) debug_message,' Status = ',Status
189       CALL wrf_message ( TRIM(wrf_err_message) )
190     ENDIF
192     IF ( wrf_at_debug_level( 500 ) ) THEN
193       CALL end_timing('wrf_ext_write_field')
194     ENDIF
196   END SUBROUTINE wrf_ext_write_field