*IF DEF,C99_1A,AND,DEF,MPP INIOASIS.2
C******************************COPYRIGHT****************************** INIOASIS.3
C(c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. INIOASIS.4
C INIOASIS.5
CUse, duplication or disclosure of this code is subject to the INIOASIS.6
Crestrictions as set forth in the contract. INIOASIS.7
C INIOASIS.8
C Meteorological Office INIOASIS.9
C London Road INIOASIS.10
C BRACKNELL INIOASIS.11
C Berkshire UK INIOASIS.12
C RG12 2SZ INIOASIS.13
C INIOASIS.14
CIf no contract has been raised with this copy of the code, the use, INIOASIS.15
Cduplication or disclosure of it is strictly prohibited. Permission INIOASIS.16
Cto do so must first be obtained in writing from the Head of Numerical INIOASIS.17
CModelling at the above address. INIOASIS.18
C******************************COPYRIGHT****************************** INIOASIS.19
C INIOASIS.20
CLL Routine: INIT_OASIS ------------------------------------------- INIOASIS.21
CLL INIOASIS.22
CLL Purpose: Initialises address pointers needed by OASIS_STEP when INIOASIS.23
CLL running the UM with an external model connected by the OASIS INIOASIS.24
CLL coupler. INIOASIS.25
CLL Also handles the generation of the grid and mask defintions for INIOASIS.26
CLL the coupler, plus the production of the restart fields for INIOASIS.27
CLL OASIS when it restarts a coupled simulation. (Although those INIOASIS.28
CLL last items might be moved outside this part of the code, into a INIOASIS.29
CLL small executable scanning the dumps). INIOASIS.30
CLL Takes care of opening the communication channels for each of INIOASIS.31
CLL the fields exchanged with the coupler, plus the general one for INIOASIS.32
CLL the coupler itself. INIOASIS.33
CLL Subroutine FINDPTR and FINDLOOKPTR are used, in this instance INIOASIS.34
CLL searching the STASHlist INIOASIS.35
CLL on section/item codes and STASHmacro tagging information. INIOASIS.36
CLL INIOASIS.37
CLL Tested under compiler: cft77 INIOASIS.38
CLL Tested under OS version: UNICOS 9.0.4 (C90) INIOASIS.39
CLL INIOASIS.40
CLL Author: JC Thil. INIOASIS.41
CLL INIOASIS.42
CLL Code version no: 1.0 Date: 10 Oct 1996 INIOASIS.43
CLL INIOASIS.44
CLL Model Modification history: INIOASIS.45
CLL version date INIOASIS.46
!LL 4.5 13/01/98 Replaced IOVARS by ATM_LSM P.Burton GPB2F405.72
!LL 4.5 18/09/98 Corrected non-standard FORMAT statment GPB0F405.152
!LL P.Burton GPB0F405.153
CLL INIOASIS.47
CLL INIOASIS.48
CLL INIOASIS.49
CLL INIOASIS.50
CLL Programming standard: UM Doc Paper 3, version 2 (7/9/90) INIOASIS.51
CLL INIOASIS.52
CLL Logical components covered: INIOASIS.53
CLL INIOASIS.54
CLL Project task: INIOASIS.55
CLL INIOASIS.56
CLL External documentation: INIOASIS.57
CLL INIOASIS.58
CLL INIOASIS.59
CLL ----------------------------------------------------------------- INIOASIS.60
C*L Interface and arguments: ---------------------------------------- INIOASIS.61
C INIOASIS.62
SUBROUTINE INIT_OASIS ( 2,6INIOASIS.63
*CALL ARGSIZE
INIOASIS.64
*CALL ARGD1
INIOASIS.65
*CALL ARGSTS
INIOASIS.66
*CALL ARGDUMA
INIOASIS.67
*CALL ARGDUMO
INIOASIS.68
*CALL ARGPTRA
INIOASIS.69
*CALL ARGPTRO
INIOASIS.70
*CALL ARGCONA
INIOASIS.71
*CALL ARGCONO
INIOASIS.72
& internal_model, INIOASIS.73
& ICODE,CMESSAGE ) INIOASIS.74
C INIOASIS.75
IMPLICIT NONE INIOASIS.76
C INIOASIS.77
*CALL CMAXSIZE
INIOASIS.78
*CALL CSUBMODL
INIOASIS.79
*CALL TYPSIZE
INIOASIS.80
*CALL TYPD1
INIOASIS.81
*CALL TYPSTS
INIOASIS.82
*CALL TYPDUMA
INIOASIS.83
*CALL TYPDUMO
INIOASIS.84
*CALL TYPPTRA
INIOASIS.85
*CALL TYPPTRO
INIOASIS.86
*CALL TYPCONA
INIOASIS.87
*CALL TYPCONO
INIOASIS.88
C INIOASIS.89
integer internal_model INIOASIS.90
INIOASIS.91
INTEGER ICODE ! OUT - Error return code INIOASIS.92
CHARACTER*(*) CMESSAGE ! OUT - Error return message INIOASIS.93
INIOASIS.94
INIOASIS.95
integer iost ! return status of the open statement. INIOASIS.96
external ini_z_ptr INIOASIS.97
C INIOASIS.98
C* ---------------------------- Include files ------------------------ INIOASIS.99
C INIOASIS.100
*CALL COASIS
INIOASIS.101
C INIOASIS.102
C -------------------------------------------------------------------- INIOASIS.103
C INIOASIS.104
INIOASIS.105
C INIOASIS.106
C Common blocks INIOASIS.107
C INIOASIS.108
*CALL C_MDI
INIOASIS.109
*CALL STPARAM
INIOASIS.110
*CALL C_PI
INIOASIS.111
INIOASIS.112
*CALL PARVARS
INIOASIS.113
*CALL DECOMPTP
INIOASIS.114
*CALL DECOMPDB
INIOASIS.115
*CALL AMAXSIZE
INIOASIS.116
*CALL ATM_LSM
GPB2F405.73
C INIOASIS.118
C INIOASIS.119
C INIOASIS.120
C Local variables INIOASIS.121
C INIOASIS.122
real Rearth INIOASIS.123
parameter (Rearth = 6 366 198 ) ! Radius of the earth in meters INIOASIS.124
real INIOASIS.125
& Zlatitude1 ! latitudes delimiting the gridboxes. INIOASIS.126
& , Zlatitude2 ! INIOASIS.127
C INIOASIS.128
C declatarions for the atmosphere model : INIOASIS.129
*IF DEF,ATMOS INIOASIS.130
real INIOASIS.131
& xta(0:g_row_length+1) ! atmosphere tp longitude coordinates INIOASIS.132
& , xua(0:g_row_length+1) ! atmosphere uv longitude coordinates INIOASIS.133
& , yta(0:g_p_rows+1) ! atmosphere tp latitude coordinates INIOASIS.134
& , yua(0:g_u_rows+1) ! atmosphere uv latitude coordinates INIOASIS.135
! INIOASIS.136
! The masks are defined twice here, once as real, INIOASIS.137
! once as integer. And that's because they are handled INIOASIS.138
! as real in the UM while OASIS expects integers. INIOASIS.139
! INIOASIS.140
logical INIOASIS.141
& Zmaskua(g_row_length,g_u_rows) ! atmosphere mask on u grid INIOASIS.142
& , Zmaskta(g_row_length,g_p_rows) ! atmosphere mask on t grid INIOASIS.143
integer INIOASIS.144
& imaskua(g_row_length,g_u_rows) ! atmosphere mask on u grid INIOASIS.145
& , imaskta(g_row_length,g_p_rows) ! atmosphere mask on t grid INIOASIS.146
! INIOASIS.147
! surface arrays INIOASIS.148
! INIOASIS.149
real INIOASIS.150
& surfua(g_row_length,g_u_rows) ! atmosphere surface on u grid INIOASIS.151
& , surfta(g_row_length,g_p_rows) ! atmosphere surface on t grid INIOASIS.152
INIOASIS.153
! INIOASIS.154
! Arrays holding the latitudes, longitudes for both sub-models, INIOASIS.155
! and both type of grids. INIOASIS.156
! INIOASIS.157
real INIOASIS.158
& Zxua(g_row_length,g_u_rows) ! atm longitude on u grid INIOASIS.159
& , Zxta(g_row_length,g_p_rows) ! atm longitude on t grid INIOASIS.160
& , Zyua(g_row_length,g_u_rows) ! atm latitude on u grid INIOASIS.161
& , Zyta(g_row_length,g_p_rows) ! atm latitude on t grid INIOASIS.162
*ENDIF INIOASIS.163
C declations for the ocean model : INIOASIS.164
*IF DEF,OCEAN INIOASIS.165
INIOASIS.166
*CALL TYPOCDPT
INIOASIS.167
! INIOASIS.168
! Grid points definition. A virtual point is added at the begining INIOASIS.169
! and end of each of the coordinate system to allow a more regular INIOASIS.170
! computation of the surfaces. INIOASIS.171
! INIOASIS.172
real INIOASIS.173
& xuo(0:g_imt+1) ! ocean uv longitude coordinates INIOASIS.174
& ,xto(0:g_imt+1) ! ocean ts longitude coordinates INIOASIS.175
& ,yuo(0:g_jmtm1+1) ! ocean uv latitude coordinates INIOASIS.176
& ,yto(0:g_jmt+1) ! ocean ts latitude coordinates INIOASIS.177
! INIOASIS.178
! The masks are defined twice here, once as real, INIOASIS.179
! once as integer. And that's because they are handled INIOASIS.180
! as real in the UM while OASIS expects integers. INIOASIS.181
! INIOASIS.182
integer INIOASIS.183
& imaskto(g_imt,g_jmt) ! ocean mask on t grid INIOASIS.184
& , imaskuo(g_imt,g_jmt) ! ocean mask on u grid INIOASIS.185
! INIOASIS.186
! surface arrays INIOASIS.187
! INIOASIS.188
real INIOASIS.189
& surfto(g_imt,g_jmt) ! ocean surface on t grid INIOASIS.190
& , surfuo(g_imt,g_jmtm1) ! ocean surface on u grid INIOASIS.191
INIOASIS.192
INIOASIS.193
! INIOASIS.194
! Arrays holding the latitudes, longitudes for both sub-models, INIOASIS.195
! and both type of grids. INIOASIS.196
! INIOASIS.197
real INIOASIS.198
& Zxuo(g_imt,g_jmtm1) ! oce longitude on u grid INIOASIS.199
& , Zxto(g_imt,g_jmt) ! oce longitude on t grid INIOASIS.200
& , Zyuo(g_imt,g_jmtm1) ! oce latitude on u grid INIOASIS.201
& , Zyto(g_imt,g_jmt) ! oce latitude on t grid INIOASIS.202
INIOASIS.203
real INIOASIS.204
& fkmp(g_imt,g_jmt) !in number of levels at ocean T points INIOASIS.205
& ,fkmq(g_imt,g_jmt) !in number of levels at ocean U points INIOASIS.206
INIOASIS.207
*ENDIF INIOASIS.208
INIOASIS.209
integer ll, p ! indexes. INIOASIS.210
INIOASIS.211
c*-------------------------------------------------------------------- INIOASIS.212
c INIOASIS.213
write(nulou,*) "entering INIOASIS" INIOASIS.214
icode = 0 INIOASIS.215
INIOASIS.216
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! INIOASIS.217
CCC Read here the input values : INIOASIS.218
C 1/ number of coupling fields. INIOASIS.219
C 2/ the list of fields itself. INIOASIS.220
INIOASIS.221
C Search for end of 'coasis_in' INIOASIS.222
ll=0 INIOASIS.223
do p=1,200 INIOASIS.224
if(coasis_in(p:p).ne.' ') then INIOASIS.225
ll=ll+1 INIOASIS.226
endif INIOASIS.227
enddo INIOASIS.228
c construct filename with pe no. appended INIOASIS.229
coasis_in(ll+1:ll+1)='.' INIOASIS.230
write(coasis_in(ll+2:ll+5),'(i2.2)') mype INIOASIS.231
INIOASIS.232
open(unit = 3, file = coasis_in) INIOASIS.233
read(3,*) NoCouplingField ! input the number of coupling fields. INIOASIS.234
if (NoCouplingField .gt. MaxCouplingField) then INIOASIS.235
icode=27 INIOASIS.236
cmessage='init_oasis: the number of coupling fields is to ' INIOASIS.237
& // 'large : increase MaxCouplingField and recompile.' INIOASIS.238
goto 999 INIOASIS.239
else INIOASIS.240
C Input the description of the fields. INIOASIS.241
do ii = 1, NoCouplingField INIOASIS.242
read(3,'(a5,1x,a1,1x,a1,1x,a2,1x,a2)') GPB0F405.154
& Zinput(Zistash,ii),Zinput(Zgrd,ii), INIOASIS.244
& Zinput(Zdirection,ii),Zinput(Zexc_frequency,ii), INIOASIS.245
& Zinput(Zexc_basis,ii) INIOASIS.246
enddo INIOASIS.247
endif INIOASIS.248
close(3) ! close oasis namefile. INIOASIS.249
INIOASIS.250
c INIOASIS.251
c*-------------------------------------------------------------------- INIOASIS.252
c INIOASIS.253
C Initialise the FieldLocator array from the Input Array: INIOASIS.254
do ii = 1, NoCouplingField INIOASIS.255
FieldLocator(istash,ii) = ZInput(Zistash,ii) INIOASIS.256
FieldLocator(lon,ii) = ZInput(Zistash,ii)(1:5) // 'lon' INIOASIS.257
FieldLocator(lat,ii) = ZInput(Zistash,ii)(1:5) // 'lat' INIOASIS.258
FieldLocator(msk,ii) = ZInput(Zistash,ii)(1:5) // 'msk' INIOASIS.259
FieldLocator(srf,ii) = ZInput(Zistash,ii)(1:5) // 'srf' INIOASIS.260
FieldLocator(grd,ii) = ZInput(Zgrd,ii) INIOASIS.261
FieldLocator(direction,ii) = ZInput(Zdirection,ii) INIOASIS.262
FieldLocator(exc_frequency,ii) = ZInput(Zexc_frequency,ii) INIOASIS.263
FieldLocator(exc_basis,ii) = ZInput(Zexc_basis,ii) INIOASIS.264
enddo INIOASIS.265
INIOASIS.266
C INIOASIS.267
c INIOASIS.268
c*-------------------------------------------------------------------- INIOASIS.269
c INIOASIS.270
c Initialise the communication channels with the OASIS coupler : INIOASIS.271
c Either create pipes, or pvm channels. ( pipes until now ) INIOASIS.272
c INIOASIS.273
c The pipes are only handled by one PE. INIOASIS.274
c INIOASIS.275
if (mype .eq. gather_pe) then INIOASIS.276
call ini_cmc
( INIOASIS.277
*CALL ARGSIZE
INIOASIS.278
*CALL ARGD1
INIOASIS.279
*CALL ARGSTS
INIOASIS.280
*CALL ARGDUMA
INIOASIS.281
*CALL ARGDUMO
INIOASIS.282
*CALL ARGPTRA
INIOASIS.283
*CALL ARGPTRO
INIOASIS.284
*CALL ARGCONA
INIOASIS.285
*CALL ARGCONO
INIOASIS.286
& internal_model, INIOASIS.287
& 1, INIOASIS.288
& ICODE,CMESSAGE ) INIOASIS.289
if (icode .ne. 0) goto 999 INIOASIS.290
endif ! mype INIOASIS.291
C INIOASIS.292
C*- Most of the computation below need only be done on one PE. INIOASIS.293
C INIOASIS.294
if (mype .eq. gather_pe) then INIOASIS.295
INIOASIS.296
c*-------------------------------------------------------------------- INIOASIS.297
C Split the work according to wether the UM internal model INIOASIS.298
C is the atmosphere or the ocean. Any other submodel is INIOASIS.299
C not (yet) implemented and the code fails on error in such a INIOASIS.300
C case. INIOASIS.301
INIOASIS.302
if(internal_model.eq.atmos_im) then ! atmosphere ( 1.a & 1.b ) INIOASIS.303
INIOASIS.304
*IF DEF,ATMOS INIOASIS.305
cl-------------------------------------------------------------------- INIOASIS.306
C 2. calculate size of each of the coupling fields. INIOASIS.307
do ii = 1, NoCouplingField INIOASIS.308
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.309
FieldSize(ii) = g_row_length * g_u_rows INIOASIS.310
else ! TP grid. INIOASIS.311
FieldSize(ii) = g_row_length * g_p_rows INIOASIS.312
endif INIOASIS.313
enddo INIOASIS.314
INIOASIS.315
INIOASIS.316
cl-------------------------------------------------------------------- INIOASIS.317
cl 3. calculate gridline coordinates on all grids using dump INIOASIS.318
cl information on grid spacing and position INIOASIS.319
c INIOASIS.320
! define the grids of the atmosphere UM submodel. INIOASIS.321
do ii = 0, g_row_length + 1 INIOASIS.322
xta(ii)=a_realhd(4)+(ii-1)*a_realhd(1) INIOASIS.323
xua(ii)=a_realhd(4)+(ii-0.5)*a_realhd(1) INIOASIS.324
enddo INIOASIS.325
do j = 0, g_p_rows + 1 INIOASIS.326
yta(j)=a_realhd(3)-(j-1)*a_realhd(2) INIOASIS.327
enddo INIOASIS.328
do j = 0, g_u_rows + 1 INIOASIS.329
yua(j)=a_realhd(3)-(j-0.5)*a_realhd(2) INIOASIS.330
enddo INIOASIS.331
INIOASIS.332
INIOASIS.333
! Develop those 1D array onto 2D arrays in order to suit the oasis INIOASIS.334
! layout. INIOASIS.335
do ii = 1, g_row_length INIOASIS.336
do j = 1, g_u_rows INIOASIS.337
Zxua(ii,j) = xua(ii) ! longitude on u grid INIOASIS.338
Zyua(ii,j) = yua(j) ! latitude on u grid INIOASIS.339
enddo INIOASIS.340
enddo INIOASIS.341
do ii = 1, g_row_length INIOASIS.342
do j = 1, g_p_rows INIOASIS.343
Zxta(ii,j) = xta(ii) ! longitude on t grid INIOASIS.344
Zyta(ii,j) = yta(j) ! latitude on t grid INIOASIS.345
enddo INIOASIS.346
enddo INIOASIS.347
! define the mask grids of the atmosphere UM submodel. INIOASIS.348
! T grid : INIOASIS.349
do j = 1, g_p_rows INIOASIS.350
do ii = 1, g_row_length INIOASIS.351
if (atmos_landmask(ii+(j-1)*g_row_length)) then INIOASIS.352
Zmaskta(ii,j)= .true. INIOASIS.353
imaskta(ii,j)= 1 INIOASIS.354
else INIOASIS.355
Zmaskta(ii,j)= .false. INIOASIS.356
imaskta(ii,j)= 0 INIOASIS.357
endif INIOASIS.358
enddo INIOASIS.359
enddo INIOASIS.360
C set up logical land/sea mask on atmosphere UV grid INIOASIS.361
do j = 1, g_u_rows INIOASIS.362
do ii = 1, g_row_length-1 INIOASIS.363
Zmaskua(ii,j) = INIOASIS.364
& Zmaskta(ii,j) .or. Zmaskta(ii+1,j) INIOASIS.365
& .or. Zmaskta(ii,j+1) .or. Zmaskta(ii+1,j+1) INIOASIS.366
enddo INIOASIS.367
Zmaskua(g_row_length,j) = INIOASIS.368
& Zmaskta(g_row_length,j) .or. Zmaskta(1,j) INIOASIS.369
& .or. Zmaskta(g_row_length,j+1) .or. Zmaskta(1,j+1) INIOASIS.370
enddo INIOASIS.371
! Generate an integer mask from the logical mask above ; INIOASIS.372
! 1 = land, 0 = ocean. (as requiered by OASIS). INIOASIS.373
do j = 1, g_u_rows INIOASIS.374
do ii = 1, g_row_length INIOASIS.375
if (Zmaskua(ii,j)) then INIOASIS.376
imaskua(ii, j) = 1 INIOASIS.377
else INIOASIS.378
imaskua(ii, j) = 0 INIOASIS.379
endif INIOASIS.380
enddo INIOASIS.381
enddo INIOASIS.382
INIOASIS.383
!--------------------------------------------------------------------- INIOASIS.384
! prepare the surface grids here : INIOASIS.385
INIOASIS.386
! u grid INIOASIS.387
do ii = 1, g_row_length INIOASIS.388
do j = 1, g_u_rows INIOASIS.389
Zlatitude1 = (yua(j-1)+yua(j))/2. INIOASIS.390
Zlatitude2 = (yua(j+1)+yua(j))/2. INIOASIS.391
if (Zlatitude1 .gt. 90.0) Zlatitude1 = 90.0 INIOASIS.392
if (Zlatitude2 .gt. 90.0) Zlatitude2 = 90.0 INIOASIS.393
if (Zlatitude1 .lt. -90.0) Zlatitude1 = -90.0 INIOASIS.394
if (Zlatitude2 .lt. -90.0) Zlatitude2 = -90.0 INIOASIS.395
surfua(ii,j) = Rearth * Rearth ! on u grid INIOASIS.396
& * abs( INIOASIS.397
& ( sin(pi_over_180*Zlatitude2) INIOASIS.398
& - sin(pi_over_180*Zlatitude1) ) INIOASIS.399
& * pi_over_180 INIOASIS.400
& * ((xua(ii+1)+xua(ii))/2. - (xua(ii-1)+xua(ii))/2.) INIOASIS.401
& ) INIOASIS.402
enddo INIOASIS.403
enddo INIOASIS.404
INIOASIS.405
! p grid INIOASIS.406
do ii = 1, g_row_length INIOASIS.407
do j = 1, g_p_rows INIOASIS.408
Zlatitude1 = (yta(j-1)+yta(j))/2. INIOASIS.409
Zlatitude2 = (yta(j+1)+yta(j))/2. INIOASIS.410
if (Zlatitude1 .gt. 90.0) Zlatitude1 = 90.0 INIOASIS.411
if (Zlatitude2 .gt. 90.0) Zlatitude2 = 90.0 INIOASIS.412
if (Zlatitude1 .lt. -90.0) Zlatitude1 = -90.0 INIOASIS.413
if (Zlatitude2 .lt. -90.0) Zlatitude2 = -90.0 INIOASIS.414
surfta(ii,j) = Rearth * Rearth ! on u grid INIOASIS.415
& * abs( INIOASIS.416
& ( sin(pi_over_180*Zlatitude2) INIOASIS.417
& - sin(pi_over_180*Zlatitude1) ) INIOASIS.418
& * pi_over_180 INIOASIS.419
& * ((xta(ii+1)+xta(ii))/2. - (xta(ii-1)+xta(ii))/2.) INIOASIS.420
& ) INIOASIS.421
enddo INIOASIS.422
enddo INIOASIS.423
INIOASIS.424
!--------------------------------------------------------------------- INIOASIS.425
! Write to file the grids of the coupling INIOASIS.426
! fields. INIOASIS.427
! Note : the layout of the atmos grid is reverse of the one of oasis; INIOASIS.428
! therefore the descending j indexes for masks, surf, and grids. INIOASIS.429
nulgr = 3 INIOASIS.430
OPEN (UNIT = nulgr, POSITION = 'APPEND', INIOASIS.431
& FILE = cficgr,STATUS = 'UNKNOWN', INIOASIS.432
& FORM = 'UNFORMATTED', IOSTAT = iost) INIOASIS.433
if (iost .ne. 0) then INIOASIS.434
icode = 1 INIOASIS.435
cmessage = 'io error in INIT_OASIS from UM atmos model.' INIOASIS.436
endif INIOASIS.437
do ii = 1, NoCouplingField INIOASIS.438
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.439
! locator for the longitude array: INIOASIS.440
write(nulgr) FieldLocator(lon,ii) INIOASIS.441
! longitude array: INIOASIS.442
write(nulgr) ((Zxua(i,j),i=1,g_row_length), INIOASIS.443
& j=g_u_rows,1,-1) INIOASIS.444
! locator for the latitude array: INIOASIS.445
write(nulgr) FieldLocator(lat,ii) INIOASIS.446
! latitude array: INIOASIS.447
write(nulgr) ((Zyua(i,j),i=1,g_row_length), INIOASIS.448
& j=g_u_rows,1,-1) INIOASIS.449
else ! T.P grids INIOASIS.450
! locator for the longitude array: INIOASIS.451
write(nulgr) FieldLocator(lon,ii) INIOASIS.452
! longitude array: INIOASIS.453
write(nulgr) ((Zxta(i,j),i=1,g_row_length), INIOASIS.454
& j=g_p_rows,1,-1) INIOASIS.455
! locator for the latitude array: INIOASIS.456
write(nulgr) FieldLocator(lat,ii) INIOASIS.457
! latitude array: INIOASIS.458
write(nulgr) ((Zyta(i,j),i=1,g_row_length), INIOASIS.459
& j=g_p_rows,1,-1) INIOASIS.460
! mask locator : INIOASIS.461
endif INIOASIS.462
enddo INIOASIS.463
! Close the grid file. INIOASIS.464
close(nulgr) INIOASIS.465
!--------------------------------------------------------------------- INIOASIS.466
INIOASIS.467
nulma = 3 INIOASIS.468
OPEN (UNIT = nulma, POSITION = 'APPEND', INIOASIS.469
& FILE = cficma,STATUS = 'UNKNOWN', INIOASIS.470
& FORM = 'UNFORMATTED', IOSTAT = iost) INIOASIS.471
if (iost .ne. 0) then INIOASIS.472
icode = 1 INIOASIS.473
cmessage = 'io error in INIT_OASIS from UM atmos model.' INIOASIS.474
endif INIOASIS.475
do ii = 1, NoCouplingField INIOASIS.476
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.477
! mask locator : INIOASIS.478
write(nulma) FieldLocator(msk,ii) INIOASIS.479
write(nulma) INIOASIS.480
& ((imaskua(i,j),i=1,g_row_length),j=g_u_rows,1,-1) INIOASIS.481
! surface locator : INIOASIS.482
else ! T.P grids INIOASIS.483
! mask locator : INIOASIS.484
write(nulma) FieldLocator(msk,ii) INIOASIS.485
write(nulma) ((imaskta(i,j),i=1,g_row_length), INIOASIS.486
& j=g_p_rows,1,-1) INIOASIS.487
endif INIOASIS.488
enddo INIOASIS.489
! Close the mask files. INIOASIS.490
close(nulma) INIOASIS.491
INIOASIS.492
!--------------------------------------------------------------------- INIOASIS.493
INIOASIS.494
nulsu = 3 INIOASIS.495
OPEN (UNIT = nulsu,POSITION = 'APPEND', INIOASIS.496
& FILE = cficsu,STATUS = 'UNKNOWN', INIOASIS.497
& FORM = 'UNFORMATTED',IOSTAT = iost) INIOASIS.498
if (iost .ne. 0) then INIOASIS.499
icode = 1 INIOASIS.500
cmessage = 'io error in INIT_OASIS from UM atmos model.' INIOASIS.501
endif INIOASIS.502
do ii = 1, NoCouplingField INIOASIS.503
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.504
write(nulsu) FieldLocator(srf,ii) INIOASIS.505
! surface filed for tx : INIOASIS.506
write(nulsu)((surfua(i,j),i=1,g_row_length), INIOASIS.507
& j=g_u_rows,1,-1) INIOASIS.508
else ! T.P grids INIOASIS.509
! surface locator : INIOASIS.510
write(nulsu) FieldLocator(srf,ii) INIOASIS.511
! surface field : INIOASIS.512
write(nulsu) ((surfta(i,j),i=1,g_row_length), INIOASIS.513
& j=g_p_rows,1,-1) INIOASIS.514
endif INIOASIS.515
enddo INIOASIS.516
! Close the grids, masks and surface files. INIOASIS.517
close(nulsu) INIOASIS.518
!--------------------------------------------------------------------- INIOASIS.519
INIOASIS.520
INIOASIS.521
*ENDIF INIOASIS.522
INIOASIS.523
cl-------------------------------------------------------------------- INIOASIS.524
C PART II : we now deal with the ocean in the following INIOASIS.525
C sections. INIOASIS.526
INIOASIS.527
elseif (internal_model.eq.ocean_im) then ! ocean ( 2.a & 2.b ) INIOASIS.528
INIOASIS.529
*IF DEF,OCEAN INIOASIS.530
C INIOASIS.531
CL SECTION 1: No. of distinct columns in ocean. INIOASIS.532
C INIOASIS.533
if (cyclic_ocean) then INIOASIS.534
g_iru=g_imt-2 INIOASIS.535
g_irt=g_iru INIOASIS.536
else INIOASIS.537
g_iru=g_imt-1 INIOASIS.538
g_irt=g_imt INIOASIS.539
endif INIOASIS.540
C INIOASIS.541
cl-------------------------------------------------------------------- INIOASIS.542
C 2. calculate size of each of the coupling fields using dump INIOASIS.543
C info. INIOASIS.544
do ii = 1, NoCouplingField INIOASIS.545
if (FieldLocator(grd,ii) .eq. 'U') then ! U grid INIOASIS.546
FieldSize(ii) = (g_iru) * (g_jmtm1) INIOASIS.547
else ! TS grid INIOASIS.548
FieldSize(ii) = (g_irt) * (g_jmt) INIOASIS.549
endif INIOASIS.550
enddo INIOASIS.551
INIOASIS.552
cl-------------------------------------------------------------------- INIOASIS.553
cl 3. calculate gridline coordinates on all grids using dump INIOASIS.554
cl information on grid spacing and position INIOASIS.555
if (global_ocean.and..not.cyclic_ocean) then INIOASIS.556
icode=24 INIOASIS.557
cmessage='init_oasis: a coupled global ocean must be cyclic' INIOASIS.558
goto 999 INIOASIS.559
elseif (.not.global_ocean.and.cyclic_ocean) then INIOASIS.560
icode=25 INIOASIS.561
cmessage='init_oasis: ' INIOASIS.562
& //'a coupled limited-area ocean must not be cyclic' INIOASIS.563
goto 999 INIOASIS.564
endif INIOASIS.565
! if (a_realhd(5).ne.o_realhd(5).or.a_realhd(6).ne.o_realhd(6)) INIOASIS.566
! & then INIOASIS.567
! icode=26 INIOASIS.568
! cmessage='init_oasis: ' INIOASIS.569
! & //'coupled atmosphere and ocean must have coincident poles' INIOASIS.570
! goto 999 INIOASIS.571
! endif INIOASIS.572
INIOASIS.573
! define the grids of the ocean UM submodel. INIOASIS.574
! the global alternative can be removed when we are sure that the INIOASIS.575
! ocean dump headers have been correctly created INIOASIS.576
if (global_ocean) then INIOASIS.577
xuo(1)=o_realhd(4)+0.5*o_realhd(1) INIOASIS.578
else INIOASIS.579
xuo(1)=o_realhd(8) INIOASIS.580
endif INIOASIS.581
xuo(0)=xuo(1)-o_coldepc(1) INIOASIS.582
xto(1)=xuo(1)-0.5*o_coldepc(1) INIOASIS.583
xto(0)=xto(1)-o_coldepc(1) INIOASIS.584
do ii=2,g_imt INIOASIS.585
xuo(ii)=xuo(ii-1)+o_coldepc(ii) INIOASIS.586
xto(ii)=xto(ii-1)+0.5*(o_coldepc(ii-1)+o_coldepc(ii)) INIOASIS.587
enddo INIOASIS.588
xuo(g_imt+1)=xuo(g_imt)+o_coldepc(g_imt) INIOASIS.589
xto(g_imt+1)=xto(g_imt)+o_coldepc(g_imt) INIOASIS.590
INIOASIS.591
yuo(1)=o_realhd(7) INIOASIS.592
yuo(0)=yuo(1)-o_rowdepc(1) INIOASIS.593
yto(1)=yuo(1)-0.5*o_rowdepc(1) INIOASIS.594
yto(0)=yto(1)-o_rowdepc(1) INIOASIS.595
do j=2,g_jmt INIOASIS.596
yuo(j)=yuo(j-1)+o_rowdepc(j) INIOASIS.597
yto(j)=yto(j-1)+0.5*(o_rowdepc(j-1)+o_rowdepc(j)) INIOASIS.598
enddo INIOASIS.599
yto(g_jmt+1) = yto(g_jmt)+o_rowdepc(g_jmt) INIOASIS.600
INIOASIS.601
! Develop those 1D array onto 2D arrays in order to suit the oasis INIOASIS.602
! layout. INIOASIS.603
do ii = 1, g_imt INIOASIS.604
do j = 1, g_jmtm1 INIOASIS.605
Zxuo(ii,j) = xuo(ii) ! longitude on u grid INIOASIS.606
Zyuo(ii,j) = yuo(j) ! latitude on u grid INIOASIS.607
enddo INIOASIS.608
enddo INIOASIS.609
INIOASIS.610
do ii = 1, g_imt INIOASIS.611
do j = 1, g_jmt INIOASIS.612
Zxto(ii,j) = xto(ii) ! longitude on t grid INIOASIS.613
Zyto(ii,j) = yto(j) ! latitude on t grid INIOASIS.614
enddo INIOASIS.615
enddo INIOASIS.616
INIOASIS.617
! define the mask grids of the ocean UM submodel. INIOASIS.618
! TS grid : (use the number of levels) INIOASIS.619
INIOASIS.620
do j = 1, g_jmt INIOASIS.621
do ii = 1, g_imt INIOASIS.622
if ( o_flddepc(ii+(j-1)*g_imt) .lt. 0.1 ) then INIOASIS.623
imaskto(ii,j) = 1 INIOASIS.624
else INIOASIS.625
imaskto(ii,j) = 0 INIOASIS.626
endif INIOASIS.627
enddo INIOASIS.628
enddo INIOASIS.629
! UV grid : (use the number of levels) INIOASIS.630
do j = 1, g_jmt INIOASIS.631
do ii = 1, g_imt INIOASIS.632
if ( (o_spcon(jocp_fkmq_global+ii-1+(j-1)*g_imt)) INIOASIS.633
& .LT. (0.1) ) then INIOASIS.634
imaskuo(ii,j) = 1 INIOASIS.635
else INIOASIS.636
imaskuo(ii,j) = 0 INIOASIS.637
endif INIOASIS.638
enddo INIOASIS.639
enddo INIOASIS.640
INIOASIS.641
!--------------------------------------------------------------------- INIOASIS.642
! prepare the surface grids here : INIOASIS.643
! Note that I produce the surfaces at the centre of the gridboxes. INIOASIS.644
INIOASIS.645
! on U grid : INIOASIS.646
do j = 1, g_jmtm1 INIOASIS.647
do ii = 1, g_imt INIOASIS.648
Zlatitude1 = (yuo(j-1)+yuo(j))/2. INIOASIS.649
Zlatitude2 = (yuo(j+1)+yuo(j))/2. INIOASIS.650
if (Zlatitude1 .gt. 90.0) Zlatitude1 = 90.0 INIOASIS.651
if (Zlatitude2 .gt. 90.0) Zlatitude2 = 90.0 INIOASIS.652
if (Zlatitude1 .lt. -90.0) Zlatitude1 = -90.0 INIOASIS.653
if (Zlatitude2 .lt. -90.0) Zlatitude2 = -90.0 INIOASIS.654
surfuo(ii,j) = Rearth * Rearth ! on u grid INIOASIS.655
& * abs( INIOASIS.656
& ( sin(pi_over_180* Zlatitude2 ) INIOASIS.657
& - sin(pi_over_180* Zlatitude1 ) ) INIOASIS.658
& * pi_over_180 INIOASIS.659
& * ((xuo(ii+1)+xuo(ii))/2. - (xuo(ii-1)+xuo(ii))/2.) INIOASIS.660
& ) INIOASIS.661
enddo INIOASIS.662
enddo INIOASIS.663
INIOASIS.664
! on T grid INIOASIS.665
do j = 1, g_jmt INIOASIS.666
do ii = 1, g_imt INIOASIS.667
Zlatitude1 = (yto(j-1)+yto(j))/2. INIOASIS.668
Zlatitude2 = (yto(j+1)+yto(j))/2. INIOASIS.669
if (Zlatitude1 .gt. 90.0) Zlatitude1 = 90.0 INIOASIS.670
if (Zlatitude2 .gt. 90.0) Zlatitude2 = 90.0 INIOASIS.671
if (Zlatitude1 .lt. -90.0) Zlatitude1 = -90.0 INIOASIS.672
if (Zlatitude2 .lt. -90.0) Zlatitude2 = -90.0 INIOASIS.673
surfto(ii,j) = Rearth * Rearth ! on t grid INIOASIS.674
& * abs( INIOASIS.675
& ( sin(pi_over_180*Zlatitude1) INIOASIS.676
& - sin(pi_over_180*Zlatitude2) ) INIOASIS.677
& * pi_over_180 INIOASIS.678
& * ((xto(ii+1)+xto(ii))/2. - (xto(ii-1)+xto(ii))/2.) INIOASIS.679
& ) INIOASIS.680
enddo INIOASIS.681
enddo INIOASIS.682
INIOASIS.683
INIOASIS.684
!--------------------------------------------------------------------- INIOASIS.685
! Write to file the grids, masks and surface of each of the coupling INIOASIS.686
! fields. INIOASIS.687
! a/import of fields INIOASIS.688
! b/export of fields INIOASIS.689
nulgr = 3 INIOASIS.690
OPEN (UNIT = nulgr, POSITION = 'APPEND', INIOASIS.691
& FILE = cficgr,STATUS = 'UNKNOWN', INIOASIS.692
& FORM = 'UNFORMATTED',IOSTAT = iost) INIOASIS.693
if (iost .ne. 0) then INIOASIS.694
icode = 1 INIOASIS.695
cmessage = 'io error in INIT_OASIS from UM ocean model.' INIOASIS.696
endif INIOASIS.697
do ii = 1, NoCouplingField INIOASIS.698
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.699
! locator for the longitude array: INIOASIS.700
write(nulgr) FieldLocator(lon,ii) INIOASIS.701
! longitude array: INIOASIS.702
write(nulgr) ((Zxuo(i,j),i = 1,g_iru), j=1,g_jmtm1) INIOASIS.703
! locator for the latitude array: INIOASIS.704
write(nulgr) FieldLocator(lat,ii) INIOASIS.705
! latitude array: INIOASIS.706
write(nulgr) ((Zyuo(i,j),i = 1,g_iru), j=1,g_jmtm1) INIOASIS.707
! mask locator : INIOASIS.708
else ! T grids INIOASIS.709
! locator for the longitude array: INIOASIS.710
write(nulgr) FieldLocator(lon,ii) INIOASIS.711
! longitude array: INIOASIS.712
write(nulgr) ((Zxto(i,j),i = 1,g_irt), j=1,g_jmt) INIOASIS.713
! locator for the latitude array: INIOASIS.714
write(nulgr) FieldLocator(lat,ii) INIOASIS.715
! latitude array: INIOASIS.716
write(nulgr) ((Zyto(i,j),i = 1,g_irt), j=1,g_jmt) INIOASIS.717
! mask locator : INIOASIS.718
endif INIOASIS.719
enddo INIOASIS.720
! Close the grids, masks and surface files. INIOASIS.721
close(nulgr) INIOASIS.722
INIOASIS.723
!--------------------------------------------------------------------- INIOASIS.724
! Write to file the masks of the coupling INIOASIS.725
! fields. INIOASIS.726
! a/import of fields INIOASIS.727
! b/export of fields INIOASIS.728
nulsu = 3 INIOASIS.729
OPEN (UNIT = nulsu, POSITION = 'APPEND', INIOASIS.730
& FILE = cficsu,STATUS = 'UNKNOWN', INIOASIS.731
& FORM = 'UNFORMATTED',IOSTAT = iost) INIOASIS.732
if (iost .ne. 0) then INIOASIS.733
icode = 1 INIOASIS.734
cmessage = 'io error in INIT_OASIS from UM ocean model.' INIOASIS.735
endif INIOASIS.736
do ii = 1, NoCouplingField INIOASIS.737
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.738
! locator for the longitude array: INIOASIS.739
write(nulsu) FieldLocator(srf,ii) INIOASIS.740
! surface filed for tx : INIOASIS.741
write(nulsu) ((surfuo(i,j),i = 1,g_iru), j=1,g_jmtm1) INIOASIS.742
else ! T grids INIOASIS.743
! surface locator : INIOASIS.744
write(nulsu) FieldLocator(srf,ii) INIOASIS.745
! surface field : INIOASIS.746
write(nulsu) ((surfto(i,j),i = 1,g_irt), j=1,g_jmt) INIOASIS.747
endif INIOASIS.748
enddo INIOASIS.749
! Close the grids, masks and surface files. INIOASIS.750
close(nulsu) INIOASIS.751
INIOASIS.752
!--------------------------------------------------------------------- INIOASIS.753
! Write to file the grids, masks and surface of each of the coupling INIOASIS.754
! fields. INIOASIS.755
! a/import of fields INIOASIS.756
! b/export of fields INIOASIS.757
nulma = 3 INIOASIS.758
OPEN (UNIT = nulma, POSITION = 'APPEND', INIOASIS.759
& FILE = cficma,STATUS = 'UNKNOWN', INIOASIS.760
& FORM = 'UNFORMATTED',IOSTAT = iost) INIOASIS.761
if (iost .ne. 0) then INIOASIS.762
icode = 1 INIOASIS.763
cmessage = 'io error in INIT_OASIS from UM ocean model.' INIOASIS.764
endif INIOASIS.765
do ii = 1, NoCouplingField INIOASIS.766
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.767
! mask locator : INIOASIS.768
write(nulma) FieldLocator(msk,ii) INIOASIS.769
write(nulma) ((imaskuo(i,j),i = 1,g_iru),j=1,g_jmtm1) INIOASIS.770
else ! T grids INIOASIS.771
! mask locator : INIOASIS.772
write(nulma) FieldLocator(msk,ii) INIOASIS.773
write(nulma) ((imaskto(i,j),i = 1,g_irt), j=1,g_jmt) INIOASIS.774
endif INIOASIS.775
enddo INIOASIS.776
! Close the grids, masks and surface files. INIOASIS.777
close(nulma) INIOASIS.778
INIOASIS.779
*ENDIF INIOASIS.780
INIOASIS.781
else ! neither ocean or atmosphere UM have been selected. INIOASIS.782
icode = -1 INIOASIS.783
write(nulou,*) INIOASIS.784
& 'Coupling with UM internal model different from' INIOASIS.785
write(nulou,*) INIOASIS.786
& 'the atmosphere or the ocean not currently allowed.' INIOASIS.787
goto 999 INIOASIS.788
endif ! atmos or ocean model. INIOASIS.789
INIOASIS.790
endif ! mype. INIOASIS.791
! INIOASIS.792
! Initialise pointers of the coupling fields to the D1 array : INIOASIS.793
! INIOASIS.794
INIOASIS.795
call ini_z_ptr
( INIOASIS.796
*CALL ARGSIZE
INIOASIS.797
*CALL ARGD1
INIOASIS.798
*CALL ARGSTS
INIOASIS.799
*CALL ARGDUMA
INIOASIS.800
*CALL ARGDUMO
INIOASIS.801
*CALL ARGPTRA
INIOASIS.802
*CALL ARGPTRO
INIOASIS.803
& internal_model, INIOASIS.804
& ICODE,CMESSAGE ) INIOASIS.805
if (icode .ne. 0) goto 999 INIOASIS.806
INIOASIS.807
c INIOASIS.808
c Send OK to the coupler indicating the initialization phase has INIOASIS.809
c been completed. INIOASIS.810
c INIOASIS.811
c The pipes are only handled by one PE. INIOASIS.812
c INIOASIS.813
if (mype .eq. gather_pe) then INIOASIS.814
call ini_cmc
( INIOASIS.815
*CALL ARGSIZE
INIOASIS.816
*CALL ARGD1
INIOASIS.817
*CALL ARGSTS
INIOASIS.818
*CALL ARGDUMA
INIOASIS.819
*CALL ARGDUMO
INIOASIS.820
*CALL ARGPTRA
INIOASIS.821
*CALL ARGPTRO
INIOASIS.822
*CALL ARGCONA
INIOASIS.823
*CALL ARGCONO
INIOASIS.824
& internal_model, INIOASIS.825
& 2, INIOASIS.826
& ICODE,CMESSAGE ) INIOASIS.827
if (icode .ne. 0) goto 999 INIOASIS.828
endif ! mype INIOASIS.829
write(nulou,*) "exiting INIOASIS" INIOASIS.830
INIOASIS.831
!------------------------------------------------ INIOASIS.832
! error trap. INIOASIS.833
999 continue INIOASIS.834
if(icode.ne.0) then INIOASIS.835
write(nulou,*) cmessage,icode INIOASIS.836
endif INIOASIS.837
INIOASIS.838
return INIOASIS.839
end INIOASIS.840
INIOASIS.841
*ENDIF INIOASIS.842
*IF DEF,C99_1A,AND,-DEF,MPP INIOASIS.846
SUBROUTINE INIT_OASIS ( 2,6INIOASIS.847
*CALL ARGSIZE
INIOASIS.848
*CALL ARGD1
INIOASIS.849
*CALL ARGSTS
INIOASIS.850
*CALL ARGDUMA
INIOASIS.851
*CALL ARGDUMO
INIOASIS.852
*CALL ARGPTRA
INIOASIS.853
*CALL ARGPTRO
INIOASIS.854
*CALL ARGCONA
INIOASIS.855
*CALL ARGCONO
INIOASIS.856
& internal_model, INIOASIS.857
& ICODE,CMESSAGE ) INIOASIS.858
C INIOASIS.859
IMPLICIT NONE INIOASIS.860
C INIOASIS.861
*CALL CMAXSIZE
INIOASIS.862
*CALL CSUBMODL
INIOASIS.863
*CALL TYPSIZE
INIOASIS.864
*CALL TYPD1
INIOASIS.865
*CALL TYPSTS
INIOASIS.866
*CALL TYPDUMA
INIOASIS.867
*CALL TYPDUMO
INIOASIS.868
*CALL TYPPTRA
INIOASIS.869
*CALL TYPPTRO
INIOASIS.870
*CALL TYPCONA
INIOASIS.871
*CALL TYPCONO
INIOASIS.872
C INIOASIS.873
integer internal_model INIOASIS.874
INIOASIS.875
INTEGER ICODE ! OUT - Error return code INIOASIS.876
CHARACTER*(*) CMESSAGE ! OUT - Error return message INIOASIS.877
INIOASIS.878
real INIOASIS.879
& fkmp(imt,jmt) !in number of levels at ocean T points INIOASIS.880
& ,fkmq(imt,jmt) !in number of levels at ocean U points INIOASIS.881
INIOASIS.882
integer iost ! return status of the open statement. INIOASIS.883
INIOASIS.884
INIOASIS.885
external ini_z_ptr, p_to_uv INIOASIS.886
C INIOASIS.887
C* ---------------------------- Include files ------------------------ INIOASIS.888
C INIOASIS.889
*CALL COASIS
INIOASIS.890
C INIOASIS.891
C -------------------------------------------------------------------- INIOASIS.892
C INIOASIS.893
INIOASIS.894
C INIOASIS.895
C*-------------------------------------------------------------------- INIOASIS.896
INIOASIS.897
C INIOASIS.898
C Common blocks INIOASIS.899
C INIOASIS.900
*CALL C_MDI
INIOASIS.901
*CALL STPARAM
INIOASIS.902
*CALL C_PI
INIOASIS.903
C INIOASIS.904
C INIOASIS.905
C INIOASIS.906
C Local variables INIOASIS.907
C INIOASIS.908
real Rearth INIOASIS.909
parameter (Rearth = 6 366 198 ) ! Radius of the earth in meters INIOASIS.910
real INIOASIS.911
& Zlatitude1 ! latitudes delimiting the gridboxes. INIOASIS.912
& , Zlatitude2 ! INIOASIS.913
C INIOASIS.914
C declatarions for the atmosphere model : INIOASIS.915
*IF DEF,ATMOS INIOASIS.916
real INIOASIS.917
& xta(0:row_length+1) ! atmosphere tp longitude coordinates INIOASIS.918
& ,xua(0:row_length+1) ! atmosphere uv longitude coordinates INIOASIS.919
& ,yta(0:p_rows+1) ! atmosphere tp latitude coordinates INIOASIS.920
& ,yua(0:u_rows+1) ! atmosphere uv latitude coordinates INIOASIS.921
! INIOASIS.922
! The masks are defined twice here, once as real, INIOASIS.923
! once as integer. And that's because they are handled INIOASIS.924
! as real in the UM while OASIS expects integers. INIOASIS.925
! INIOASIS.926
logical INIOASIS.927
& Zmaskua(row_length,u_rows) ! atmosphere mask on u grid INIOASIS.928
& , Zmaskta(row_length,p_rows) ! atmosphere mask on t grid INIOASIS.929
integer INIOASIS.930
& imaskua(row_length,u_rows) ! atmosphere mask on u grid INIOASIS.931
& , imaskta(row_length,p_rows) ! atmosphere mask on t grid INIOASIS.932
! INIOASIS.933
! surface arrays INIOASIS.934
! INIOASIS.935
real INIOASIS.936
& surfua(row_length,u_rows) ! atmosphere surface on u grid INIOASIS.937
& , surfta(row_length,p_rows) ! atmosphere surface on t grid INIOASIS.938
INIOASIS.939
! INIOASIS.940
! Arrays holding the latitudes, longitudes for both sub-models, INIOASIS.941
! and both type of grids. INIOASIS.942
! INIOASIS.943
real INIOASIS.944
& Zxua(row_length,u_rows) ! atm longitude on u grid INIOASIS.945
& , Zxta(row_length,p_rows) ! atm longitude on t grid INIOASIS.946
& , Zyua(row_length,u_rows) ! atm latitude on u grid INIOASIS.947
& , Zyta(row_length,p_rows) ! atm latitude on t grid INIOASIS.948
*ENDIF INIOASIS.949
C declations for the ocean model : INIOASIS.950
*IF DEF,OCEAN INIOASIS.951
INIOASIS.952
*CALL TYPOCDPT
INIOASIS.953
! INIOASIS.954
! Grid points definition. A virtual point is added at the begining INIOASIS.955
! and end of each of the coordinate system to allow a more regular INIOASIS.956
! computation of the surfaces. INIOASIS.957
! INIOASIS.958
real INIOASIS.959
& xuo(0:imt+1) ! ocean uv longitude coordinates INIOASIS.960
& ,xto(0:imt+1) ! ocean ts longitude coordinates INIOASIS.961
& ,yuo(0:jmtm1+1) ! ocean uv latitude coordinates INIOASIS.962
& ,yto(0:jmt+1) ! ocean ts latitude coordinates INIOASIS.963
! INIOASIS.964
! The masks are defined twice here, once as real, INIOASIS.965
! once as integer. And that's because they are handled INIOASIS.966
! as real in the UM while OASIS expects integers. INIOASIS.967
! INIOASIS.968
integer INIOASIS.969
& imaskto(imt,jmt) ! ocean mask on t grid INIOASIS.970
& , imaskuo(imt,jmt) ! ocean mask on u grid INIOASIS.971
! INIOASIS.972
! surface arrays INIOASIS.973
! INIOASIS.974
real INIOASIS.975
& surfto(imt,jmt) ! ocean surface on t grid INIOASIS.976
& , surfuo(imt,jmtm1) ! ocean surface on u grid INIOASIS.977
INIOASIS.978
INIOASIS.979
! INIOASIS.980
! Arrays holding the latitudes, longitudes for both sub-models, INIOASIS.981
! and both type of grids. INIOASIS.982
! INIOASIS.983
real INIOASIS.984
& Zxuo(imt,jmtm1) ! oce longitude on u grid INIOASIS.985
& , Zxto(imt,jmt) ! oce longitude on t grid INIOASIS.986
& , Zyuo(imt,jmtm1) ! oce latitude on u grid INIOASIS.987
& , Zyto(imt,jmt) ! oce latitude on t grid INIOASIS.988
INIOASIS.989
*ENDIF INIOASIS.990
INIOASIS.991
c*-------------------------------------------------------------------- INIOASIS.992
c INIOASIS.993
write(nulou,*) "entering INIOASIS" INIOASIS.994
icode = 0 INIOASIS.995
INIOASIS.996
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! INIOASIS.997
CCC read here the input values : INIOASIS.998
C 1/number of coupling fields. INIOASIS.999
C 2/the list of fields itself. INIOASIS.1000
open(unit = 3, file = coasis_in) INIOASIS.1001
read(3,*) NoCouplingField ! input the number of fouplin fields. INIOASIS.1002
if (NoCouplingField .gt. MaxCouplingField) then INIOASIS.1003
icode=27 INIOASIS.1004
cmessage='init_oasis: the number of coupling fields is to ' INIOASIS.1005
& // 'large : increase MaxCouplingField and recompile.' INIOASIS.1006
goto 999 INIOASIS.1007
else INIOASIS.1008
C Input the description of the fields. INIOASIS.1009
do ii = 1, NoCouplingField INIOASIS.1010
read(3,'(a5,1x,a1,1x,a1,1x,a2,1x,a2)') GPB0F405.155
& Zinput(Zistash,ii),Zinput(Zgrd,ii), INIOASIS.1012
& Zinput(Zdirection,ii),Zinput(Zexc_frequency,ii), INIOASIS.1013
& Zinput(Zexc_basis,ii) INIOASIS.1014
enddo INIOASIS.1015
endif INIOASIS.1016
close(3) ! close oasis namefile. INIOASIS.1017
c INIOASIS.1018
c*-------------------------------------------------------------------- INIOASIS.1019
c INIOASIS.1020
C Initialise the FieldLocator array from the Input Array: INIOASIS.1021
do ii = 1, NoCouplingField INIOASIS.1022
FieldLocator(istash,ii) = ZInput(Zistash,ii) INIOASIS.1023
FieldLocator(lon,ii) = ZInput(Zistash,ii)(1:5) // 'lon' INIOASIS.1024
FieldLocator(lat,ii) = ZInput(Zistash,ii)(1:5) // 'lat' INIOASIS.1025
FieldLocator(msk,ii) = ZInput(Zistash,ii)(1:5) // 'msk' INIOASIS.1026
FieldLocator(srf,ii) = ZInput(Zistash,ii)(1:5) // 'srf' INIOASIS.1027
FieldLocator(grd,ii) = ZInput(Zgrd,ii) INIOASIS.1028
FieldLocator(direction,ii) = ZInput(Zdirection,ii) INIOASIS.1029
FieldLocator(exc_frequency,ii) = ZInput(Zexc_frequency,ii) INIOASIS.1030
FieldLocator(exc_basis,ii) = ZInput(Zexc_basis,ii) INIOASIS.1031
enddo INIOASIS.1032
INIOASIS.1033
c INIOASIS.1034
c*-------------------------------------------------------------------- INIOASIS.1035
c INIOASIS.1036
c INIOASIS.1037
c Initialise the communication channels with the OASIS coupler : INIOASIS.1038
c Either create pipes, or pvm channels. ( pipes until now ) INIOASIS.1039
c INIOASIS.1040
call ini_cmc
( INIOASIS.1041
*CALL ARGSIZE
INIOASIS.1042
*CALL ARGD1
INIOASIS.1043
*CALL ARGSTS
INIOASIS.1044
*CALL ARGDUMA
INIOASIS.1045
*CALL ARGDUMO
INIOASIS.1046
*CALL ARGPTRA
INIOASIS.1047
*CALL ARGPTRO
INIOASIS.1048
*CALL ARGCONA
INIOASIS.1049
*CALL ARGCONO
INIOASIS.1050
& internal_model, INIOASIS.1051
& 1, INIOASIS.1052
& ICODE,CMESSAGE ) INIOASIS.1053
if (icode .ne. 0) goto 999 INIOASIS.1054
c*-------------------------------------------------------------------- INIOASIS.1055
C Split the work according to wether the UM internal model INIOASIS.1056
C is the atmosphere or the ocean. Any other submodel is INIOASIS.1057
C not (yet) implemented and the code fails on error in such a case. INIOASIS.1058
INIOASIS.1059
if(internal_model.eq.atmos_im) then ! atmosphere ( 1.a & 1.b ) INIOASIS.1060
*IF DEF,ATMOS INIOASIS.1061
cl-------------------------------------------------------------------- INIOASIS.1062
C 2. calculate size of each of the coupling fields using dump INIOASIS.1063
C info. INIOASIS.1064
do ii = 1, NoCouplingField INIOASIS.1065
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.1066
FieldSize(ii) = U_FIELD INIOASIS.1067
else ! TP grid. INIOASIS.1068
FieldSize(ii) = P_FIELD INIOASIS.1069
endif INIOASIS.1070
enddo INIOASIS.1071
INIOASIS.1072
INIOASIS.1073
cl-------------------------------------------------------------------- INIOASIS.1074
cl 3. calculate gridline coordinates on all grids using dump INIOASIS.1075
cl information on grid spacing and position INIOASIS.1076
c INIOASIS.1077
! define the grids of the atmosphere UM submodel. INIOASIS.1078
do ii = 0, row_length + 1 INIOASIS.1079
xta(ii)=a_realhd(4)+(ii-1)*a_realhd(1) INIOASIS.1080
xua(ii)=a_realhd(4)+(ii-0.5)*a_realhd(1) INIOASIS.1081
enddo INIOASIS.1082
do j = 0 ,p_rows + 1 INIOASIS.1083
yta(j)=a_realhd(3)-(j-1)*a_realhd(2) INIOASIS.1084
enddo INIOASIS.1085
do j = 0 ,u_rows + 1 INIOASIS.1086
yua(j)=a_realhd(3)-(j-0.5)*a_realhd(2) INIOASIS.1087
enddo INIOASIS.1088
INIOASIS.1089
! Develop those 1D array onto 2D arrays in order to suit the oasis INIOASIS.1090
! layout. INIOASIS.1091
do ii = 1, row_length INIOASIS.1092
do j = 1, u_rows INIOASIS.1093
Zxua(ii,j) = xua(ii) ! longitude on u grid INIOASIS.1094
Zyua(ii,j) = yua(j) ! latitude on u grid INIOASIS.1095
enddo INIOASIS.1096
enddo INIOASIS.1097
do ii = 1, row_length INIOASIS.1098
do j = 1, p_rows INIOASIS.1099
Zxta(ii,j) = xta(ii) ! longitude on t grid INIOASIS.1100
Zyta(ii,j) = yta(j) ! latitude on t grid INIOASIS.1101
enddo INIOASIS.1102
enddo INIOASIS.1103
! define the mask grids of the atmosphere UM submodel. INIOASIS.1104
! T grid : INIOASIS.1105
do j = 1, p_rows INIOASIS.1106
do ii = 1, row_length INIOASIS.1107
if (LD1(jland-1+ii+(j-1)*row_length)) then INIOASIS.1108
Zmaskta(ii,j)= .true. INIOASIS.1109
imaskta(ii,j)= 1 INIOASIS.1110
else INIOASIS.1111
Zmaskta(ii,j)= .false. INIOASIS.1112
imaskta(ii,j)= 0 INIOASIS.1113
endif INIOASIS.1114
enddo INIOASIS.1115
enddo INIOASIS.1116
C set up logical land/sea mask on atmosphere UV grid INIOASIS.1117
do j = 1, u_rows INIOASIS.1118
do ii = 1, row_length-1 INIOASIS.1119
Zmaskua(ii,j) = INIOASIS.1120
& Zmaskta(ii,j) .or. Zmaskta(ii+1,j) INIOASIS.1121
& .or. Zmaskta(ii,j+1) .or. Zmaskta(ii+1,j+1) INIOASIS.1122
enddo INIOASIS.1123
Zmaskua(row_length,j) = INIOASIS.1124
& Zmaskta(row_length,j) .or. Zmaskta(1,j) INIOASIS.1125
& .or. Zmaskta(row_length,j+1) .or. Zmaskta(1,j+1) INIOASIS.1126
enddo INIOASIS.1127
! Generate an integer mask from the logical mask above ; INIOASIS.1128
! 1 = land, 0 = ocean. (as requiered by OASIS). INIOASIS.1129
INIOASIS.1130
do j = 1, u_rows INIOASIS.1131
do ii = 1, row_length INIOASIS.1132
if (Zmaskua(ii,j)) then INIOASIS.1133
imaskua(ii, j) = 1 INIOASIS.1134
else INIOASIS.1135
imaskua(ii, j) = 0 INIOASIS.1136
endif INIOASIS.1137
enddo INIOASIS.1138
enddo INIOASIS.1139
INIOASIS.1140
!--------------------------------------------------------------------- INIOASIS.1141
! prepare the surface grids here : INIOASIS.1142
INIOASIS.1143
! u grid INIOASIS.1144
do ii = 1, row_length INIOASIS.1145
do j = 1, u_rows INIOASIS.1146
Zlatitude1 = (yua(j-1)+yua(j))/2. INIOASIS.1147
Zlatitude2 = (yua(j+1)+yua(j))/2. INIOASIS.1148
if (Zlatitude1 .gt. 90.0) Zlatitude1 = 90.0 INIOASIS.1149
if (Zlatitude2 .gt. 90.0) Zlatitude2 = 90.0 INIOASIS.1150
if (Zlatitude1 .lt. -90.0) Zlatitude1 = -90.0 INIOASIS.1151
if (Zlatitude2 .lt. -90.0) Zlatitude2 = -90.0 INIOASIS.1152
surfua(ii,j) = Rearth * Rearth ! on u grid INIOASIS.1153
& * abs( INIOASIS.1154
& ( sin(pi_over_180*Zlatitude2) INIOASIS.1155
& - sin(pi_over_180*Zlatitude1) ) INIOASIS.1156
& * pi_over_180 INIOASIS.1157
& * ((xua(ii+1)+xua(ii))/2. - (xua(ii-1)+xua(ii))/2.) INIOASIS.1158
& ) INIOASIS.1159
enddo INIOASIS.1160
enddo INIOASIS.1161
INIOASIS.1162
! p grid INIOASIS.1163
do ii = 1, row_length INIOASIS.1164
do j = 1, p_rows INIOASIS.1165
Zlatitude1 = (yta(j-1)+yta(j))/2. INIOASIS.1166
Zlatitude2 = (yta(j+1)+yta(j))/2. INIOASIS.1167
if (Zlatitude1 .gt. 90.0) Zlatitude1 = 90.0 INIOASIS.1168
if (Zlatitude2 .gt. 90.0) Zlatitude2 = 90.0 INIOASIS.1169
if (Zlatitude1 .lt. -90.0) Zlatitude1 = -90.0 INIOASIS.1170
if (Zlatitude2 .lt. -90.0) Zlatitude2 = -90.0 INIOASIS.1171
surfta(ii,j) = Rearth * Rearth ! on u grid INIOASIS.1172
& * abs( INIOASIS.1173
& ( sin(pi_over_180*Zlatitude2) INIOASIS.1174
& - sin(pi_over_180*Zlatitude1) ) INIOASIS.1175
& * pi_over_180 INIOASIS.1176
& * ((xta(ii+1)+xta(ii))/2. - (xta(ii-1)+xta(ii))/2.) INIOASIS.1177
& ) INIOASIS.1178
enddo INIOASIS.1179
enddo INIOASIS.1180
INIOASIS.1181
!--------------------------------------------------------------------- INIOASIS.1182
! Write to file the grids of the coupling INIOASIS.1183
! fields. INIOASIS.1184
!! Note : the layout of the atmos grid is reverse of the one of oasis; INIOASIS.1185
!! therefore the descending j indexes for masks, surf, and grids. INIOASIS.1186
nulgr = 3 INIOASIS.1187
OPEN (UNIT = nulgr, POSITION = 'APPEND', INIOASIS.1188
& FILE = cficgr,STATUS = 'UNKNOWN', INIOASIS.1189
& FORM = 'UNFORMATTED', IOSTAT = iost) INIOASIS.1190
if (iost .ne. 0) then INIOASIS.1191
icode = 1 INIOASIS.1192
cmessage = 'io error in INIT_OASIS from UM atmos model.' INIOASIS.1193
endif INIOASIS.1194
do ii = 1, NoCouplingField INIOASIS.1195
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.1196
! locator for the longitude array: INIOASIS.1197
write(nulgr) FieldLocator(lon,ii) INIOASIS.1198
! longitude array: INIOASIS.1199
write(nulgr) ((Zxua(i,j),i=1,row_length),j=u_rows,1,-1) INIOASIS.1200
! locator for the latitude array: INIOASIS.1201
write(nulgr) FieldLocator(lat,ii) INIOASIS.1202
! latitude array: INIOASIS.1203
write(nulgr) ((Zyua(i,j),i=1,row_length),j=u_rows,1,-1) INIOASIS.1204
else ! T.P grids INIOASIS.1205
! locator for the longitude array: INIOASIS.1206
write(nulgr) FieldLocator(lon,ii) INIOASIS.1207
! longitude array: INIOASIS.1208
write(nulgr) ((Zxta(i,j),i=1,row_length),j=p_rows,1,-1) INIOASIS.1209
! locator for the latitude array: INIOASIS.1210
write(nulgr) FieldLocator(lat,ii) INIOASIS.1211
! latitude array: INIOASIS.1212
write(nulgr) ((Zyta(i,j),i=1,row_length),j=p_rows,1,-1) INIOASIS.1213
! mask locator : INIOASIS.1214
endif INIOASIS.1215
enddo INIOASIS.1216
! Close the grid file. INIOASIS.1217
close(nulgr) INIOASIS.1218
!--------------------------------------------------------------------- INIOASIS.1219
INIOASIS.1220
nulma = 3 INIOASIS.1221
OPEN (UNIT = nulma, POSITION = 'APPEND', INIOASIS.1222
& FILE = cficma,STATUS = 'UNKNOWN', INIOASIS.1223
& FORM = 'UNFORMATTED', IOSTAT = iost) INIOASIS.1224
if (iost .ne. 0) then INIOASIS.1225
icode = 1 INIOASIS.1226
cmessage = 'io error in INIT_OASIS from UM atmos model.' INIOASIS.1227
endif INIOASIS.1228
do ii = 1, NoCouplingField INIOASIS.1229
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.1230
! mask locator : INIOASIS.1231
write(nulma) FieldLocator(msk,ii) INIOASIS.1232
write(nulma) INIOASIS.1233
& ((imaskua(i,j),i=1,row_length),j=u_rows,1,-1) INIOASIS.1234
! surface locator : INIOASIS.1235
else ! T.P grids INIOASIS.1236
! mask locator : INIOASIS.1237
write(nulma) FieldLocator(msk,ii) INIOASIS.1238
write(nulma) ((imaskta(i,j),i=1,row_length),j=p_rows,1,-1) INIOASIS.1239
endif INIOASIS.1240
enddo INIOASIS.1241
! Close the mask files. INIOASIS.1242
close(nulma) INIOASIS.1243
INIOASIS.1244
!--------------------------------------------------------------------- INIOASIS.1245
INIOASIS.1246
nulsu = 3 INIOASIS.1247
OPEN (UNIT = nulsu,POSITION = 'APPEND', INIOASIS.1248
& FILE = cficsu,STATUS = 'UNKNOWN', INIOASIS.1249
& FORM = 'UNFORMATTED',IOSTAT = iost) INIOASIS.1250
if (iost .ne. 0) then INIOASIS.1251
icode = 1 INIOASIS.1252
cmessage = 'io error in INIT_OASIS from UM atmos model.' INIOASIS.1253
endif INIOASIS.1254
do ii = 1, NoCouplingField INIOASIS.1255
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.1256
write(nulsu) FieldLocator(srf,ii) INIOASIS.1257
! surface filed for tx : INIOASIS.1258
write(nulsu)((surfua(i,j),i=1,row_length),j=u_rows,1,-1) INIOASIS.1259
else ! T.P grids INIOASIS.1260
! surface locator : INIOASIS.1261
write(nulsu) FieldLocator(srf,ii) INIOASIS.1262
! surface field : INIOASIS.1263
write(nulsu) ((surfta(i,j),i=1,row_length),j=p_rows,1,-1) INIOASIS.1264
endif INIOASIS.1265
enddo INIOASIS.1266
! Close the grids, masks and surface files. INIOASIS.1267
close(nulsu) INIOASIS.1268
!--------------------------------------------------------------------- INIOASIS.1269
INIOASIS.1270
INIOASIS.1271
INIOASIS.1272
*ENDIF INIOASIS.1273
INIOASIS.1274
cl-------------------------------------------------------------------- INIOASIS.1275
C PART II : we now deal with the ocean in the following INIOASIS.1276
C sections. INIOASIS.1277
INIOASIS.1278
elseif (internal_model.eq.ocean_im) then ! ocean ( 2.a & 2.b ) INIOASIS.1279
INIOASIS.1280
*IF DEF,OCEAN INIOASIS.1281
C INIOASIS.1282
CL SECTION 1: No. of distinct columns in ocean. INIOASIS.1283
C INIOASIS.1284
if (cyclic_ocean) then INIOASIS.1285
iru=imt-2 INIOASIS.1286
irt=iru INIOASIS.1287
else INIOASIS.1288
iru=imt-1 INIOASIS.1289
irt=imt INIOASIS.1290
endif INIOASIS.1291
C INIOASIS.1292
cl-------------------------------------------------------------------- INIOASIS.1293
C 2. calculate size of each of the coupling fields using dump INIOASIS.1294
C info. INIOASIS.1295
do ii = 1, NoCouplingField INIOASIS.1296
if (FieldLocator(grd,ii) .eq. 'U') then ! U grid INIOASIS.1297
FieldSize(ii) = (iru) * (jmtm1) INIOASIS.1298
else ! TS grid INIOASIS.1299
FieldSize(ii) = (irt) * (jmt) INIOASIS.1300
endif INIOASIS.1301
enddo INIOASIS.1302
INIOASIS.1303
cl-------------------------------------------------------------------- INIOASIS.1304
cl 3. calculate gridline coordinates on all grids using dump INIOASIS.1305
cl information on grid spacing and position INIOASIS.1306
if (global_ocean.and..not.cyclic_ocean) then INIOASIS.1307
icode=24 INIOASIS.1308
cmessage='init_oasis: a coupled global ocean must be cyclic' INIOASIS.1309
goto 999 INIOASIS.1310
elseif (.not.global_ocean.and.cyclic_ocean) then INIOASIS.1311
icode=25 INIOASIS.1312
cmessage='init_oasis: ' INIOASIS.1313
& //'a coupled limited-area ocean must not be cyclic' INIOASIS.1314
goto 999 INIOASIS.1315
endif INIOASIS.1316
! if (a_realhd(5).ne.o_realhd(5).or.a_realhd(6).ne.o_realhd(6)) INIOASIS.1317
! & then INIOASIS.1318
! icode=26 INIOASIS.1319
! cmessage='init_oasis: ' INIOASIS.1320
! & //'coupled atmosphere and ocean must have coincident poles' INIOASIS.1321
! goto 999 INIOASIS.1322
! endif INIOASIS.1323
INIOASIS.1324
! define the grids of the ocean UM submodel. INIOASIS.1325
! the global alternative can be removed when we are sure that the INIOASIS.1326
! ocean dump headers have been correctly created INIOASIS.1327
if (global_ocean) then INIOASIS.1328
xuo(1)=o_realhd(4)+0.5*o_realhd(1) INIOASIS.1329
else INIOASIS.1330
xuo(1)=o_realhd(8) INIOASIS.1331
endif INIOASIS.1332
xuo(0)=xuo(1)-o_coldepc(1) INIOASIS.1333
xto(1)=xuo(1)-0.5*o_coldepc(1) INIOASIS.1334
xto(0)=xto(1)-o_coldepc(1) INIOASIS.1335
do ii=2,imt INIOASIS.1336
xuo(ii)=xuo(ii-1)+o_coldepc(ii) INIOASIS.1337
xto(ii)=xto(ii-1)+0.5*(o_coldepc(ii-1)+o_coldepc(ii)) INIOASIS.1338
enddo INIOASIS.1339
xuo(imt+1)=xuo(imt)+o_coldepc(imt) INIOASIS.1340
xto(imt+1)=xto(imt)+o_coldepc(imt) INIOASIS.1341
INIOASIS.1342
yuo(1)=o_realhd(7) INIOASIS.1343
yuo(0)=yuo(1)-o_rowdepc(1) INIOASIS.1344
yto(1)=yuo(1)-0.5*o_rowdepc(1) INIOASIS.1345
yto(0)=yto(1)-o_rowdepc(1) INIOASIS.1346
do j=2,jmt INIOASIS.1347
yuo(j)=yuo(j-1)+o_rowdepc(j) INIOASIS.1348
yto(j)=yto(j-1)+0.5*(o_rowdepc(j-1)+o_rowdepc(j)) INIOASIS.1349
enddo INIOASIS.1350
yto(jmt+1) = yto(jmt)+o_rowdepc(jmt) INIOASIS.1351
INIOASIS.1352
! Develop those 1D array onto 2D arrays in order to suit the oasis INIOASIS.1353
! layout. INIOASIS.1354
do ii = 1, imt INIOASIS.1355
do j = 1, jmtm1 INIOASIS.1356
Zxuo(ii,j) = xuo(ii) ! longitude on u grid INIOASIS.1357
Zyuo(ii,j) = yuo(j) ! latitude on u grid INIOASIS.1358
enddo INIOASIS.1359
enddo INIOASIS.1360
do ii = 1, imt INIOASIS.1361
do j = 1, jmt INIOASIS.1362
Zxto(ii,j) = xto(ii) ! longitude on t grid INIOASIS.1363
Zyto(ii,j) = yto(j) ! latitude on t grid INIOASIS.1364
enddo INIOASIS.1365
enddo INIOASIS.1366
INIOASIS.1367
! define the mask grids of the ocean UM submodel. INIOASIS.1368
! TS grid : (use the number of levels) INIOASIS.1369
do j = 1, jmt INIOASIS.1370
do ii = 1, imt INIOASIS.1371
if ( o_flddepc(ii+(j-1)*imt) .lt. 0.1 ) then INIOASIS.1372
imaskto(ii,j) = 1 INIOASIS.1373
else INIOASIS.1374
imaskto(ii,j) = 0 INIOASIS.1375
endif INIOASIS.1376
enddo INIOASIS.1377
enddo INIOASIS.1378
! UV grid : (use the number of levels) INIOASIS.1379
do j = 1, jmt INIOASIS.1380
do ii = 1, imt INIOASIS.1381
if ( (o_spcon(jocp_fkmq+ii-1+(j-1)*imt)) .LT. (0.1) ) then INIOASIS.1382
imaskuo(ii,j) = 1 INIOASIS.1383
else INIOASIS.1384
imaskuo(ii,j) = 0 INIOASIS.1385
endif INIOASIS.1386
enddo INIOASIS.1387
enddo INIOASIS.1388
INIOASIS.1389
!--------------------------------------------------------------------- INIOASIS.1390
! prepare the surface grids here : INIOASIS.1391
! Note that I produce the surfaces at the centre of the gridboxes. INIOASIS.1392
INIOASIS.1393
! on U grid : INIOASIS.1394
do j = 1, jmtm1 INIOASIS.1395
do ii = 1, imt INIOASIS.1396
Zlatitude1 = (yuo(j-1)+yuo(j))/2. INIOASIS.1397
Zlatitude2 = (yuo(j+1)+yuo(j))/2. INIOASIS.1398
if (Zlatitude1 .gt. 90.0) Zlatitude1 = 90.0 INIOASIS.1399
if (Zlatitude2 .gt. 90.0) Zlatitude2 = 90.0 INIOASIS.1400
if (Zlatitude1 .lt. -90.0) Zlatitude1 = -90.0 INIOASIS.1401
if (Zlatitude2 .lt. -90.0) Zlatitude2 = -90.0 INIOASIS.1402
surfuo(ii,j) = Rearth * Rearth ! on u grid INIOASIS.1403
& * abs( INIOASIS.1404
& ( sin(pi_over_180* Zlatitude2 ) INIOASIS.1405
& - sin(pi_over_180* Zlatitude1 ) ) INIOASIS.1406
& * pi_over_180 INIOASIS.1407
& * ((xuo(ii+1)+xuo(ii))/2. - (xuo(ii-1)+xuo(ii))/2.) INIOASIS.1408
& ) INIOASIS.1409
enddo INIOASIS.1410
enddo INIOASIS.1411
INIOASIS.1412
! on T grid INIOASIS.1413
do j = 1, jmt INIOASIS.1414
do ii = 1, imt INIOASIS.1415
Zlatitude1 = (yto(j-1)+yto(j))/2. INIOASIS.1416
Zlatitude2 = (yto(j+1)+yto(j))/2. INIOASIS.1417
if (Zlatitude1 .gt. 90.0) Zlatitude1 = 90.0 INIOASIS.1418
if (Zlatitude2 .gt. 90.0) Zlatitude2 = 90.0 INIOASIS.1419
if (Zlatitude1 .lt. -90.0) Zlatitude1 = -90.0 INIOASIS.1420
if (Zlatitude2 .lt. -90.0) Zlatitude2 = -90.0 INIOASIS.1421
surfto(ii,j) = Rearth * Rearth ! on t grid INIOASIS.1422
& * abs( INIOASIS.1423
& ( sin(pi_over_180*Zlatitude1) INIOASIS.1424
& - sin(pi_over_180*Zlatitude2) ) INIOASIS.1425
& * pi_over_180 INIOASIS.1426
& * ((xto(ii+1)+xto(ii))/2. - (xto(ii-1)+xto(ii))/2.) INIOASIS.1427
& ) INIOASIS.1428
enddo INIOASIS.1429
enddo INIOASIS.1430
INIOASIS.1431
INIOASIS.1432
!--------------------------------------------------------------------- INIOASIS.1433
! Write to file the grids, masks and surface of each of the coupling INIOASIS.1434
! fields. INIOASIS.1435
! a/import of fields INIOASIS.1436
! b/export of fields INIOASIS.1437
nulgr = 3 INIOASIS.1438
OPEN (UNIT = nulgr, POSITION = 'APPEND', INIOASIS.1439
& FILE = cficgr,STATUS = 'UNKNOWN', INIOASIS.1440
& FORM = 'UNFORMATTED',IOSTAT = iost) INIOASIS.1441
if (iost .ne. 0) then INIOASIS.1442
icode = 1 INIOASIS.1443
cmessage = 'io error in INIT_OASIS from UM ocean model.' INIOASIS.1444
endif INIOASIS.1445
do ii = 1, NoCouplingField INIOASIS.1446
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.1447
! locator for the longitude array: INIOASIS.1448
write(nulgr) FieldLocator(lon,ii) INIOASIS.1449
! longitude array: INIOASIS.1450
write(nulgr) ((Zxuo(i,j),i = 1,iru), j=1,jmtm1) INIOASIS.1451
! locator for the latitude array: INIOASIS.1452
write(nulgr) FieldLocator(lat,ii) INIOASIS.1453
! latitude array: INIOASIS.1454
write(nulgr) ((Zyuo(i,j),i = 1,iru), j=1,jmtm1) INIOASIS.1455
! mask locator : INIOASIS.1456
else ! T grids INIOASIS.1457
! locator for the longitude array: INIOASIS.1458
write(nulgr) FieldLocator(lon,ii) INIOASIS.1459
! longitude array: INIOASIS.1460
write(nulgr) ((Zxto(i,j),i = 1,irt), j=1,jmt) INIOASIS.1461
! locator for the latitude array: INIOASIS.1462
write(nulgr) FieldLocator(lat,ii) INIOASIS.1463
! latitude array: INIOASIS.1464
write(nulgr) ((Zyto(i,j),i = 1,irt), j=1,jmt) INIOASIS.1465
! mask locator : INIOASIS.1466
endif INIOASIS.1467
enddo INIOASIS.1468
! Close the grids, masks and surface files. INIOASIS.1469
close(nulgr) INIOASIS.1470
INIOASIS.1471
!--------------------------------------------------------------------- INIOASIS.1472
! Write to file the masks of the coupling INIOASIS.1473
! fields. INIOASIS.1474
! a/import of fields INIOASIS.1475
! b/export of fields INIOASIS.1476
nulsu = 3 INIOASIS.1477
OPEN (UNIT = nulsu, POSITION = 'APPEND', INIOASIS.1478
& FILE = cficsu,STATUS = 'UNKNOWN', INIOASIS.1479
& FORM = 'UNFORMATTED',IOSTAT = iost) INIOASIS.1480
if (iost .ne. 0) then INIOASIS.1481
icode = 1 INIOASIS.1482
cmessage = 'io error in INIT_OASIS from UM ocean model.' INIOASIS.1483
endif INIOASIS.1484
do ii = 1, NoCouplingField INIOASIS.1485
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.1486
! locator for the longitude array: INIOASIS.1487
write(nulsu) FieldLocator(srf,ii) INIOASIS.1488
! surface filed for tx : INIOASIS.1489
write(nulsu) ((surfuo(i,j),i = 1,iru), j=1,jmtm1) INIOASIS.1490
else ! T grids INIOASIS.1491
! surface locator : INIOASIS.1492
write(nulsu) FieldLocator(srf,ii) INIOASIS.1493
! surface field : INIOASIS.1494
write(nulsu) ((surfto(i,j),i = 1,irt), j=1,jmt) INIOASIS.1495
endif INIOASIS.1496
enddo INIOASIS.1497
! Close the grids, masks and surface files. INIOASIS.1498
close(nulsu) INIOASIS.1499
INIOASIS.1500
!--------------------------------------------------------------------- INIOASIS.1501
! Write to file the grids, masks and surface of each of the coupling INIOASIS.1502
! fields. INIOASIS.1503
! a/import of fields INIOASIS.1504
! b/export of fields INIOASIS.1505
nulma = 3 INIOASIS.1506
OPEN (UNIT = nulma, POSITION = 'APPEND', INIOASIS.1507
& FILE = cficma,STATUS = 'UNKNOWN', INIOASIS.1508
& FORM = 'UNFORMATTED',IOSTAT = iost) INIOASIS.1509
if (iost .ne. 0) then INIOASIS.1510
icode = 1 INIOASIS.1511
cmessage = 'io error in INIT_OASIS from UM ocean model.' INIOASIS.1512
endif INIOASIS.1513
do ii = 1, NoCouplingField INIOASIS.1514
if (FieldLocator(grd,ii) .eq. 'U') then ! U grids INIOASIS.1515
! mask locator : INIOASIS.1516
write(nulma) FieldLocator(msk,ii) INIOASIS.1517
write(nulma) ((imaskuo(i,j),i = 1,iru),j=1,jmtm1) INIOASIS.1518
else ! T grids INIOASIS.1519
! mask locator : INIOASIS.1520
write(nulma) FieldLocator(msk,ii) INIOASIS.1521
write(nulma) ((imaskto(i,j),i = 1,irt), j=1,jmt) INIOASIS.1522
endif INIOASIS.1523
enddo INIOASIS.1524
! Close the grids, masks and surface files. INIOASIS.1525
close(nulma) INIOASIS.1526
INIOASIS.1527
*ENDIF INIOASIS.1528
INIOASIS.1529
else ! neither ocean or atmosphere UM have been selected. INIOASIS.1530
icode = -1 INIOASIS.1531
write(nulou,*) INIOASIS.1532
& 'Coupling with UM internal model different from' INIOASIS.1533
write(nulou,*) INIOASIS.1534
& 'the atmosphere or the ocean not currently allowed.' INIOASIS.1535
goto 999 INIOASIS.1536
endif INIOASIS.1537
INIOASIS.1538
! INIOASIS.1539
! Initialise pointers of the coupling fields to the D1 array : INIOASIS.1540
! INIOASIS.1541
call ini_z_ptr
( INIOASIS.1542
*CALL ARGSIZE
INIOASIS.1543
*CALL ARGD1
INIOASIS.1544
*CALL ARGSTS
INIOASIS.1545
*CALL ARGDUMA
INIOASIS.1546
*CALL ARGDUMO
INIOASIS.1547
*CALL ARGPTRA
INIOASIS.1548
*CALL ARGPTRO
INIOASIS.1549
& internal_model, INIOASIS.1550
& ICODE,CMESSAGE ) INIOASIS.1551
if (icode .ne. 0) goto 999 INIOASIS.1552
INIOASIS.1553
c INIOASIS.1554
c Send OK to the coupler indicating the initialization phase has INIOASIS.1555
c been completed. INIOASIS.1556
c INIOASIS.1557
call ini_cmc
( INIOASIS.1558
*CALL ARGSIZE
INIOASIS.1559
*CALL ARGD1
INIOASIS.1560
*CALL ARGSTS
INIOASIS.1561
*CALL ARGDUMA
INIOASIS.1562
*CALL ARGDUMO
INIOASIS.1563
*CALL ARGPTRA
INIOASIS.1564
*CALL ARGPTRO
INIOASIS.1565
*CALL ARGCONA
INIOASIS.1566
*CALL ARGCONO
INIOASIS.1567
& internal_model, INIOASIS.1568
& 2, INIOASIS.1569
& ICODE,CMESSAGE ) INIOASIS.1570
if (icode .ne. 0) goto 999 INIOASIS.1571
INIOASIS.1572
write(nulou,*) "exiting INIOASIS" INIOASIS.1573
INIOASIS.1574
!------------------------------------------------ INIOASIS.1575
! error trap. INIOASIS.1576
999 continue INIOASIS.1577
if(icode.ne.0) then INIOASIS.1578
write(nulou,*) cmessage,icode INIOASIS.1579
endif INIOASIS.1580
INIOASIS.1581
return INIOASIS.1582
end INIOASIS.1583
INIOASIS.1584
*ENDIF INIOASIS.1585