1 |
!_ --------------------------------------------------------------------- |
2 |
!_ RCS lines preceded by "c_ " |
3 |
!_ --------------------------------------------------------------------- |
4 |
!_ |
5 |
!_ $Revision: 1.1 $ |
6 |
!_ $Date: 1999/11/18 17:20:23 $ ; $State: Exp $ |
7 |
!_ $Author: rdslater $ ; $Locker: $ |
8 |
!_ $Revised for use in Ocean inversion project by sfletcher |
9 |
!_ |
10 |
!_ --------------------------------------------------------------------- |
11 |
!_ $Log: write_nc_basisfnctns.f,v $ |
12 |
!_ Revision 1.1 1999/11/18 17:20:23 rdslater |
13 |
!_ Initial conversion of OCMIP-2 routines. |
14 |
!_ |
15 |
!_Revision1.5 2003/2/12 sfletcher |
16 |
!_corrected for some errors |
17 |
!_ |
18 |
!_ Revision 1.4 2003/2/12 sfletcher |
19 |
!_Modified to write dye tracers for ocean inversion |
20 |
!_ |
21 |
!_ Revision 1.3 1999/10/19 10:36:44 jomce |
22 |
!_ Split RCS file and revision indicator across two lines (< 72 chars) |
23 |
!_ |
24 |
!_ Revision 1.2 1999/10/19 09:46:26 jomce |
25 |
!_ Added "a" to end of filename (root) to identify annual files (nt=1) |
26 |
!_ Added string to identify RCS filename and revision |
27 |
!_ |
28 |
!_ Revision 1.1 1999/10/04 12:38:48 orr |
29 |
!_ Initial revision |
30 |
!_ |
31 |
!_ --------------------------------------------------------------------- |
32 |
!_ |
33 |
!*********************************************************************** |
34 |
! |
35 |
! NAME: WRITE_NC_basisfnctns |
36 |
! |
37 |
! INPUT: |
38 |
! group= group code (ex: IPSL) |
39 |
! production= production (model and version ex: OPA 8.1) |
40 |
! run=Timedep or Stationary |
41 |
! imt= dimension |
42 |
! jmt= dimension |
43 |
! kmt= dimension |
44 |
! ndyetrac=number of dye tracers |
45 |
! year= year of simulation [years] |
46 |
! nb_seconds_per_year= following your model year [s] |
47 |
! nb_timesteps_per_year= following your model timestep |
48 |
! |
49 |
! dye_arr= Concentration of dye tracer [mol/cm^3] |
50 |
! |
51 |
! OUTPUT FILE: |
52 |
! A netcdf file (clobbed if exists) with |
53 |
! the filename group_dye_basisfnctns.nc |
54 |
! |
55 |
!*********************************************************************** |
56 |
|
57 |
SUBROUTINE WRITE_NC_basisfnctns( |
58 |
& group,production,run, |
59 |
& imt,jmt,kmt,ndyetrac, |
60 |
& year,nb_seconds_per_year,nb_timesteps_per_year, |
61 |
& dye_arr) |
62 |
|
63 |
! No implicit declarations |
64 |
IMPLICIT NONE |
65 |
|
66 |
! Arguments |
67 |
CHARACTER*(*) group |
68 |
CHARACTER*(*) run |
69 |
CHARACTER*(*) production |
70 |
INTEGER imt,jmt,kmt,ndyetrac |
71 |
INTEGER year |
72 |
INTEGER nb_seconds_per_year |
73 |
INTEGER nb_timesteps_per_year |
74 |
REAL dye_arr(imt,jmt,kmt,ndyetrac) |
75 |
|
76 |
! Constants |
77 |
REAL missing_value |
78 |
PARAMETER (missing_value=-1.E+34) |
79 |
|
80 |
! Local variables |
81 |
CHARACTER*256 string256,filename |
82 |
CHARACTER*4 string4 |
83 |
INTEGER I |
84 |
|
85 |
! Function |
86 |
! INTEGER LEN_TRIM |
87 |
|
88 |
! NetCDF variables |
89 |
|
90 |
include "netcdf.inc" |
91 |
|
92 |
INTEGER NC_ID |
93 |
INTEGER STATUS |
94 |
INTEGER LON_DIM |
95 |
INTEGER LAT_DIM |
96 |
INTEGER DEPTH_DIM |
97 |
INTEGER TRAC_DIM |
98 |
INTEGER DYE_ID |
99 |
INTEGER DIMS_4D(4) |
100 |
|
101 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
102 |
! Build the NetCDF filename |
103 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
104 |
WRITE(string4,'(I4.4)') year |
105 |
|
106 |
filename=group//'_'//run//'_BasisFNCTNS_'// |
107 |
& string4//'.nc' |
108 |
|
109 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
110 |
! Open the NetCDF file |
111 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
112 |
STATUS=NF_CREATE(filename,NF_CLOBBER,NC_ID) |
113 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
114 |
|
115 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
116 |
! Define dimensions |
117 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
118 |
STATUS=NF_DEF_DIM(NC_ID,'x',imt,LON_DIM) |
119 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
120 |
|
121 |
STATUS=NF_DEF_DIM(NC_ID,'y',jmt,LAT_DIM) |
122 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
123 |
|
124 |
STATUS=NF_DEF_DIM(NC_ID,'depth',kmt,DEPTH_DIM) |
125 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
126 |
|
127 |
STATUS=NF_DEF_DIM(NC_ID,'tracer',ndyetrac,TRAC_DIM) |
128 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
129 |
|
130 |
|
131 |
|
132 |
!--------------------------------------------------------- |
133 |
DIMS_4D(1)=LON_DIM |
134 |
DIMS_4D(2)=LAT_DIM |
135 |
DIMS_4D(3)=DEPTH_DIM |
136 |
DIMS_4D(4)=TRAC_DIM |
137 |
STATUS=NF_DEF_VAR(NC_ID,'DYE',NF_FLOAT, |
138 |
& 4,DIMS_4D,DYE_ID) |
139 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
140 |
|
141 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
142 |
! Define global attributes |
143 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
144 |
string256='$RCSfile: write_nc_basisfnctns.F,v $' |
145 |
& //'$Revision: 1.1 $' |
146 |
STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL, |
147 |
& 'output_routine',LEN_TRIM(string256),string256) |
148 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
149 |
|
150 |
!--------------------------------------------------------- |
151 |
string256='GDT 1.2' |
152 |
STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'Conventions', |
153 |
& LEN_TRIM(string256),string256) |
154 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
155 |
|
156 |
!--------------------------------------------------------- |
157 |
string256=filename |
158 |
STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'file_name', |
159 |
& LEN_TRIM(string256),string256) |
160 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
161 |
|
162 |
!--------------------------------------------------------- |
163 |
string256=group//'_grid.nc' |
164 |
STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'associate_file', |
165 |
& LEN_TRIM(string256),string256) |
166 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
167 |
|
168 |
!--------------------------------------------------------- |
169 |
string256='Ocean Inversion Project' |
170 |
STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'project', |
171 |
& LEN_TRIM(string256),string256) |
172 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
173 |
|
174 |
!--------------------------------------------------------- |
175 |
string256=group |
176 |
STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'institution', |
177 |
& LEN_TRIM(string256),string256) |
178 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
179 |
|
180 |
!--------------------------------------------------------- |
181 |
string256=production |
182 |
STATUS=NF_PUT_ATT_TEXT(NC_ID,NF_GLOBAL,'production', |
183 |
& LEN_TRIM(string256),string256) |
184 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
185 |
|
186 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
187 |
! Define variable attributes |
188 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
189 |
|
190 |
|
191 |
STATUS=NF_PUT_ATT_INT(NC_ID,DYE_ID,'nb_seconds_per_year', |
192 |
& NF_INT,1,nb_seconds_per_year) |
193 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
194 |
|
195 |
STATUS=NF_PUT_ATT_INT(NC_ID,DYE_ID,'nb_timesteps_per_year', |
196 |
& NF_INT,1,nb_timesteps_per_year) |
197 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
198 |
|
199 |
!--------------------------------------------------------- |
200 |
string256='Concentration of Dye Tracer' |
201 |
STATUS=NF_PUT_ATT_TEXT(NC_ID,DYE_ID,'long_name', |
202 |
& LEN_TRIM(string256),string256) |
203 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
204 |
|
205 |
string256='mol/cm^3' |
206 |
STATUS=NF_PUT_ATT_TEXT(NC_ID,DYE_ID,'units', |
207 |
& LEN_TRIM(string256),string256) |
208 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
209 |
|
210 |
STATUS=NF_PUT_ATT_REAL(NC_ID,DYE_ID,'missing_value', |
211 |
& NF_FLOAT,1,missing_value) |
212 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
213 |
|
214 |
|
215 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
216 |
! End of define mode |
217 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
218 |
STATUS=NF_ENDDEF(NC_ID) |
219 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
220 |
|
221 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
222 |
! Write data to file |
223 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
224 |
|
225 |
|
226 |
STATUS=NF_PUT_VAR_REAL(NC_ID,DYE_ID,dye_arr) |
227 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
228 |
|
229 |
!--------------------------------------------------------- |
230 |
! Close the NetCDF file |
231 |
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
232 |
STATUS=NF_CLOSE(NC_ID) |
233 |
IF (STATUS.NE.NF_NOERR) CALL HANDLE_ERRORS(STATUS) |
234 |
|
235 |
END |