151 |
INTEGER i, j |
INTEGER i, j |
152 |
INTEGER k, km1, kup, kDown |
INTEGER k, km1, kup, kDown |
153 |
|
|
|
Cjmc : add for phiHyd output <- but not working if multi tile per CPU |
|
|
c CHARACTER*(MAX_LEN_MBUF) suff |
|
|
c LOGICAL DIFFERENT_MULTIPLE |
|
|
c EXTERNAL DIFFERENT_MULTIPLE |
|
|
Cjmc(end) |
|
154 |
CEOP |
CEOP |
155 |
|
|
156 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
203 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
204 |
act1 = bi - myBxLo(myThid) |
act1 = bi - myBxLo(myThid) |
205 |
max1 = myBxHi(myThid) - myBxLo(myThid) + 1 |
max1 = myBxHi(myThid) - myBxLo(myThid) + 1 |
|
|
|
206 |
act2 = bj - myByLo(myThid) |
act2 = bj - myByLo(myThid) |
207 |
max2 = myByHi(myThid) - myByLo(myThid) + 1 |
max2 = myByHi(myThid) - myByLo(myThid) + 1 |
|
|
|
208 |
act3 = myThid - 1 |
act3 = myThid - 1 |
209 |
max3 = nTx*nTy |
max3 = nTx*nTy |
|
|
|
210 |
act4 = ikey_dynamics - 1 |
act4 = ikey_dynamics - 1 |
|
|
|
211 |
ikey = (act1 + 1) + act2*max1 |
ikey = (act1 + 1) + act2*max1 |
212 |
& + act3*max1*max2 |
& + act3*max1*max2 |
213 |
& + act4*max1*max2*max3 |
& + act4*max1*max2*max3 |
251 |
|
|
252 |
|
|
253 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
254 |
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte |
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=ikey, byte=isbyte |
255 |
CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte |
CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key=ikey, byte=isbyte |
256 |
|
#ifdef ALLOW_KPP |
257 |
|
CADJ STORE uvel (:,:,:,bi,bj) = comlev1_bibj, key=ikey, byte=isbyte |
258 |
|
CADJ STORE vvel (:,:,:,bi,bj) = comlev1_bibj, key=ikey, byte=isbyte |
259 |
|
#endif |
260 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
261 |
|
|
262 |
C-- Start of diagnostic loop |
C-- Start of diagnostic loop |
333 |
|
|
334 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
335 |
cph avoids recomputation of integrate_for_w |
cph avoids recomputation of integrate_for_w |
336 |
CADJ STORE wvel (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte |
CADJ STORE wvel (:,:,:,bi,bj) = comlev1_bibj, key=ikey, byte=isbyte |
337 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
338 |
|
|
339 |
#ifdef ALLOW_OBCS |
#ifdef ALLOW_OBCS |
410 |
|
|
411 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
412 |
CADJ STORE KPPghat (:,:,:,bi,bj) |
CADJ STORE KPPghat (:,:,:,bi,bj) |
|
CADJ & , KPPviscAz (:,:,:,bi,bj) |
|
413 |
CADJ & , KPPdiffKzT(:,:,:,bi,bj) |
CADJ & , KPPdiffKzT(:,:,:,bi,bj) |
414 |
CADJ & , KPPdiffKzS(:,:,:,bi,bj) |
CADJ & , KPPdiffKzS(:,:,:,bi,bj) |
415 |
CADJ & , KPPfrac (:,: ,bi,bj) |
CADJ & , KPPfrac (:,: ,bi,bj) |
419 |
#endif /* ALLOW_KPP */ |
#endif /* ALLOW_KPP */ |
420 |
|
|
421 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
422 |
CADJ STORE KappaRT(:,:,:) = comlev1_bibj, key = ikey, byte = isbyte |
CADJ STORE KappaRT(:,:,:) = comlev1_bibj, key=ikey, byte=isbyte |
423 |
CADJ STORE KappaRS(:,:,:) = comlev1_bibj, key = ikey, byte = isbyte |
CADJ STORE KappaRS(:,:,:) = comlev1_bibj, key=ikey, byte=isbyte |
424 |
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte |
CADJ STORE theta(:,:,:,bi,bj) = comlev1_bibj, key=ikey, byte=isbyte |
425 |
CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte |
CADJ STORE salt (:,:,:,bi,bj) = comlev1_bibj, key=ikey, byte=isbyte |
426 |
CADJ STORE uvel (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte |
CADJ STORE uvel (:,:,:,bi,bj) = comlev1_bibj, key=ikey, byte=isbyte |
427 |
CADJ STORE vvel (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte |
CADJ STORE vvel (:,:,:,bi,bj) = comlev1_bibj, key=ikey, byte=isbyte |
428 |
#ifdef ALLOW_PASSIVE_TRACER |
#ifdef ALLOW_PASSIVE_TRACER |
429 |
CADJ STORE tr1 (:,:,:,bi,bj) = comlev1_bibj, key = ikey, byte = isbyte |
CADJ STORE tr1 (:,:,:,bi,bj) = comlev1_bibj, key=ikey, byte=isbyte |
430 |
#endif |
#endif |
431 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
432 |
|
|
440 |
ENDIF |
ENDIF |
441 |
#endif /* ALLOW_AIM */ |
#endif /* ALLOW_AIM */ |
442 |
|
|
443 |
|
#ifdef ALLOW_TIMEAVE |
444 |
|
IF (taveFreq.GT.0. .AND. ivdc_kappa.NE.0.) THEN |
445 |
|
CALL TIMEAVE_CUMULATE(ConvectCountTave, ConvectCount, Nr, |
446 |
|
I deltaTclock, bi, bj, myThid) |
447 |
|
ENDIF |
448 |
|
#endif /* ALLOW_TIMEAVE */ |
449 |
|
|
450 |
|
#ifndef DISABLE_MULTIDIM_ADVECTION |
451 |
C-- Some advection schemes are better calculated using a multi-dimensional |
C-- Some advection schemes are better calculated using a multi-dimensional |
452 |
C method in the absence of any other terms and, if used, is done here. |
C method in the absence of any other terms and, if used, is done here. |
453 |
|
C |
454 |
|
C The CPP flag DISABLE_MULTIDIM_ADVECTION is currently unset in GAD_OPTIONS.h |
455 |
|
C The default is to use multi-dimensinal advection for non-linear advection |
456 |
|
C schemes. However, for the sake of efficiency of the adjoint it is necessary |
457 |
|
C to be able to exclude this scheme to avoid excessive storage and |
458 |
|
C recomputation. It *is* differentiable, if you need it. |
459 |
|
C Edit GAD_OPTIONS.h and #define DISABLE_MULTIDIM_ADVECTION to |
460 |
|
C disable this section of code. |
461 |
IF (multiDimAdvection) THEN |
IF (multiDimAdvection) THEN |
462 |
IF (tempStepping .AND. |
IF (tempStepping .AND. |
463 |
& tempAdvScheme.NE.ENUM_CENTERED_2ND .AND. |
& tempAdvScheme.NE.ENUM_CENTERED_2ND .AND. |
464 |
& tempAdvScheme.NE.ENUM_UPWIND_3RD .AND. |
& tempAdvScheme.NE.ENUM_UPWIND_3RD .AND. |
465 |
& tempAdvScheme.NE.ENUM_CENTERED_4TH ) |
& tempAdvScheme.NE.ENUM_CENTERED_4TH ) THEN |
466 |
& CALL GAD_ADVECTION(bi,bj,tempAdvScheme,GAD_TEMPERATURE,theta, |
CALL GAD_ADVECTION(bi,bj,tempAdvScheme,GAD_TEMPERATURE, |
467 |
U gT, |
U theta,gT, |
468 |
I myTime,myIter,myThid) |
I myTime,myIter,myThid) |
469 |
|
ENDIF |
470 |
IF (saltStepping .AND. |
IF (saltStepping .AND. |
471 |
& saltAdvScheme.NE.ENUM_CENTERED_2ND .AND. |
& saltAdvScheme.NE.ENUM_CENTERED_2ND .AND. |
472 |
& saltAdvScheme.NE.ENUM_UPWIND_3RD .AND. |
& saltAdvScheme.NE.ENUM_UPWIND_3RD .AND. |
473 |
& saltAdvScheme.NE.ENUM_CENTERED_4TH ) |
& saltAdvScheme.NE.ENUM_CENTERED_4TH ) THEN |
474 |
& CALL GAD_ADVECTION(bi,bj,saltAdvScheme,GAD_SALINITY,salt, |
CALL GAD_ADVECTION(bi,bj,saltAdvScheme,GAD_SALINITY, |
475 |
U gS, |
U salt,gS, |
476 |
I myTime,myIter,myThid) |
I myTime,myIter,myThid) |
477 |
|
ENDIF |
478 |
ENDIF |
ENDIF |
479 |
|
#endif /* DISABLE_MULTIDIM_ADVECTION */ |
480 |
|
|
481 |
C-- Start of thermodynamics loop |
C-- Start of thermodynamics loop |
482 |
DO k=Nr,1,-1 |
DO k=Nr,1,-1 |
537 |
CALL TIMESTEP_TRACER( |
CALL TIMESTEP_TRACER( |
538 |
I bi,bj,iMin,iMax,jMin,jMax,k,tempAdvScheme, |
I bi,bj,iMin,iMax,jMin,jMax,k,tempAdvScheme, |
539 |
I theta, gT, |
I theta, gT, |
|
U gTnm1, |
|
540 |
I myIter, myThid) |
I myIter, myThid) |
541 |
ENDIF |
ENDIF |
542 |
IF ( saltStepping ) THEN |
IF ( saltStepping ) THEN |
549 |
CALL TIMESTEP_TRACER( |
CALL TIMESTEP_TRACER( |
550 |
I bi,bj,iMin,iMax,jMin,jMax,k,saltAdvScheme, |
I bi,bj,iMin,iMax,jMin,jMax,k,saltAdvScheme, |
551 |
I salt, gS, |
I salt, gS, |
|
U gSnm1, |
|
552 |
I myIter, myThid) |
I myIter, myThid) |
553 |
ENDIF |
ENDIF |
554 |
#ifdef ALLOW_PASSIVE_TRACER |
#ifdef ALLOW_PASSIVE_TRACER |
562 |
CALL TIMESTEP_TRACER( |
CALL TIMESTEP_TRACER( |
563 |
I bi,bj,iMin,iMax,jMin,jMax,k,tracerAdvScheme, |
I bi,bj,iMin,iMax,jMin,jMax,k,tracerAdvScheme, |
564 |
I Tr1, gTr1, |
I Tr1, gTr1, |
|
U gTr1NM1, |
|
565 |
I myIter,myThid) |
I myIter,myThid) |
566 |
ENDIF |
ENDIF |
567 |
#endif |
#endif |
576 |
C-- Freeze water |
C-- Freeze water |
577 |
IF (allowFreezing) THEN |
IF (allowFreezing) THEN |
578 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
579 |
CADJ STORE gTNm1(:,:,k,bi,bj) = comlev1_bibj_k |
CADJ STORE gT(:,:,k,bi,bj) = comlev1_bibj_k |
580 |
CADJ & , key = kkey, byte = isbyte |
CADJ & , key = kkey, byte = isbyte |
581 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
582 |
CALL FREEZE( bi, bj, iMin, iMax, jMin, jMax, k, myThid ) |
CALL FREEZE( bi, bj, iMin, iMax, jMin, jMax, k, myThid ) |
602 |
IF (tempStepping) THEN |
IF (tempStepping) THEN |
603 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
604 |
idkey = iikey + 1 |
idkey = iikey + 1 |
605 |
CADJ STORE gTNm1(:,:,:,bi,bj) = comlev1_bibj , key=ikey, byte=isbyte |
CADJ STORE gT(:,:,:,bi,bj) = comlev1_bibj , key=ikey, byte=isbyte |
606 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
607 |
CALL IMPLDIFF( |
CALL IMPLDIFF( |
608 |
I bi, bj, iMin, iMax, jMin, jMax, |
I bi, bj, iMin, iMax, jMin, jMax, |
614 |
IF (saltStepping) THEN |
IF (saltStepping) THEN |
615 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
616 |
idkey = iikey + 2 |
idkey = iikey + 2 |
617 |
CADJ STORE gSNm1(:,:,:,bi,bj) = comlev1_bibj , key=ikey, byte=isbyte |
CADJ STORE gS(:,:,:,bi,bj) = comlev1_bibj , key=ikey, byte=isbyte |
618 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
619 |
CALL IMPLDIFF( |
CALL IMPLDIFF( |
620 |
I bi, bj, iMin, iMax, jMin, jMax, |
I bi, bj, iMin, iMax, jMin, jMax, |
626 |
#ifdef ALLOW_PASSIVE_TRACER |
#ifdef ALLOW_PASSIVE_TRACER |
627 |
IF (tr1Stepping) THEN |
IF (tr1Stepping) THEN |
628 |
#ifdef ALLOW_AUTODIFF_TAMC |
#ifdef ALLOW_AUTODIFF_TAMC |
629 |
CADJ STORE gTr1Nm1(:,:,:,bi,bj) = comlev1_bibj , key=ikey, byte=isbyte |
CADJ STORE gTr1(:,:,:,bi,bj) = comlev1_bibj , key=ikey, byte=isbyte |
630 |
#endif /* ALLOW_AUTODIFF_TAMC */ |
#endif /* ALLOW_AUTODIFF_TAMC */ |
631 |
CALL IMPLDIFF( |
CALL IMPLDIFF( |
632 |
I bi, bj, iMin, iMax, jMin, jMax, |
I bi, bj, iMin, iMax, jMin, jMax, |