Changeset 2587
- Timestamp:
- 2011-02-15T12:58:59+01:00 (14 years ago)
- Location:
- branches/TAM_V3_0
- Files:
-
- 11 added
- 39 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/TAM_V3_0/NEMO/OPA_SRC/TAM/tamtrj.F90
r1946 r2587 18 18 #endif 19 19 USE ldftra_oce ! Lateral tracer mixing coefficient defined in memory 20 #if defined key_ldfslp 20 21 USE ldfslp, ONLY : & ! Slopes of neutral surfaces 21 22 & uslp, wslpi, & ! i_slope at U- and W-points 22 23 & vslp, wslpj ! j-slope at V- and W-points 24 #endif 23 25 USE tradmp ! Tracer damping 24 26 USE sol_oce, ONLY : & ! Solver variables defined in memory -
branches/TAM_V3_0/NEMO/OPA_SRC/mppsum.F90
r1945 r2587 86 86 & jj 87 87 88 88 ! initialise to avoid uninitialised variables trapping of some compilers to complain. 89 zres = 0.0_wp ; zerr = 0.0_wp ; zbuffl(:) = 0.0_wp 89 90 ! Get global number of elements 90 91 ing = kn -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynadv_tam.F90
r1885 r2587 547 547 END IF 548 548 END SUBROUTINE dyn_adv_ctl_tam 549 549 #if defined key_tst_tlm 550 550 SUBROUTINE dyn_adv_tlm_tst( kumadt ) 551 551 !!----------------------------------------------------------------------- … … 580 580 USE tamtrj ! writing out state trajectory 581 581 USE par_tlm, ONLY: & 582 & tlm_bch, & 582 583 & cur_loop, & 583 584 & h_ratio … … 641 642 642 643 CHARACTER(LEN=14) :: cl_name 643 CHARACTER (LEN=128) :: file_out, file_wop 644 CHARACTER (LEN=128) :: file_out, file_wop, file_xdx 644 645 CHARACTER (LEN=90) :: FMT 645 646 REAL(KIND=wp), DIMENSION(100):: & … … 696 697 ! Output filename Xn=F(X0) 697 698 !-------------------------------------------------------------------- 698 file_wop='trj_wop_dynadv'699 700 699 CALL tlm_namrd 701 700 gamma = h_ratio 702 701 file_wop='trj_wop_dynadv' 702 file_xdx='trj_xdx_dynadv' 703 703 !-------------------------------------------------------------------- 704 704 ! Initialize the tangent input with random noise: dx … … 741 741 ! Complete Init for Direct 742 742 !------------------------------------------------------------------- 743 CALL istate_p743 IF ( tlm_bch /= 2 ) CALL istate_p 744 744 745 745 ! *** initialize the reference trajectory … … 769 769 ! Compute the direct model F(X0,t=n) = Xn 770 770 !-------------------------------------------------------------------- 771 CALL dyn_adv(nit000) 772 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 771 IF ( tlm_bch /= 2 ) CALL dyn_adv(nit000) 772 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 773 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 773 774 !-------------------------------------------------------------------- 774 775 ! Compute the Tangent 775 776 !-------------------------------------------------------------------- 776 IF ( cur_loop .NE. 0) THEN 777 !-------------------------------------------------------------------- 778 ! Storing data 779 !-------------------------------------------------------------------- 780 zua_out (:,:,:) = ua (:,:,:) 781 zva_out (:,:,:) = va (:,:,:) 782 777 IF ( tlm_bch == 2 ) THEN 783 778 !-------------------------------------------------------------------- 784 779 ! Initialize the tangent variables … … 812 807 zua_wop (:,:,:) = ua (:,:,:) 813 808 zva_wop (:,:,:) = va (:,:,:) 809 CALL trj_rd_spl(file_xdx) 810 zua_out (:,:,:) = ua (:,:,:) 811 zva_out (:,:,:) = va (:,:,:) 814 812 !-------------------------------------------------------------------- 815 813 ! Compute the Linearization Error … … 944 942 END SUBROUTINE dyn_adv_tlm_tst 945 943 #endif 944 #endif 946 945 END MODULE dynadv_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynhpg_tam.F90
r1885 r2587 109 109 PUBLIC dyn_hpg_adj ! routine called by step_tam module 110 110 PUBLIC dyn_hpg_adj_tst! routine called by test module 111 #if defined key_tst_tlm 111 112 PUBLIC dyn_hpg_tlm_tst! routine called by test module 113 #endif 112 114 113 115 !!* Namelist nam_dynhpg : Choice of horizontal pressure gradient computation … … 1059 1061 & ) 1060 1062 END SUBROUTINE dyn_hpg_adj_tst 1061 1063 #if defined key_tst_tlm 1062 1064 SUBROUTINE dyn_hpg_tlm_tst( kumadt ) 1063 1065 !!----------------------------------------------------------------------- … … 1089 1091 USE tamtrj ! writing out state trajectory 1090 1092 USE par_tlm, ONLY: & 1093 & tlm_bch, & 1091 1094 & cur_loop, & 1092 1095 & h_ratio … … 1160 1163 & jk 1161 1164 CHARACTER(LEN=14) :: cl_name 1162 CHARACTER (LEN=128) :: file_out, file_wop 1165 CHARACTER (LEN=128) :: file_out, file_wop, file_xdx 1163 1166 CHARACTER (LEN=90) :: FMT 1164 1167 REAL(KIND=wp), DIMENSION(100):: & … … 1228 1231 ! Output filename Xn=F(X0) 1229 1232 !-------------------------------------------------------------------- 1230 file_wop='trj_wop_dynhpg'1231 1232 1233 CALL tlm_namrd 1233 1234 gamma = h_ratio 1234 1235 file_wop='trj_wop_dynhpg' 1236 file_xdx='trj_xdx_dynhpg' 1235 1237 !-------------------------------------------------------------------- 1236 1238 ! Initialize the tangent input with random noise: dx … … 1262 1264 ! Complete Init for Direct 1263 1265 !------------------------------------------------------------------- 1264 CALL istate_p1266 IF ( tlm_bch /= 2 ) CALL istate_p 1265 1267 1266 1268 ! *** initialize the reference trajectory … … 1296 1298 ! Compute the direct model F(X0,t=n) = Xn 1297 1299 !-------------------------------------------------------------------- 1298 CALL dyn_hpg(nit000) 1299 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 1300 IF ( tlm_bch /= 2 ) CALL dyn_hpg(nit000) 1301 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 1302 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 1300 1303 !-------------------------------------------------------------------- 1301 1304 ! Compute the Tangent 1302 1305 !-------------------------------------------------------------------- 1303 IF ( cur_loop .NE. 0) THEN 1304 !-------------------------------------------------------------------- 1305 ! Storing data 1306 !-------------------------------------------------------------------- 1307 zua_out (:,:,:) = ua (:,:,:) 1308 zva_out (:,:,:) = va (:,:,:) 1309 1306 IF ( tlm_bch == 2 ) THEN 1310 1307 !-------------------------------------------------------------------- 1311 1308 ! Initialize the tangent variables … … 1324 1321 ! Compute the scalar product: ( L(t0,tn) gamma dx0 ) ) 1325 1322 !-------------------------------------------------------------------- 1326 1327 1323 zsp2_1 = DOT_PRODUCT( ua_tl, ua_tl ) 1328 1324 zsp2_2 = DOT_PRODUCT( va_tl, va_tl ) … … 1334 1330 zua_wop (:,:,:) = ua (:,:,:) 1335 1331 zva_wop (:,:,:) = va (:,:,:) 1332 CALL trj_rd_spl(file_xdx) 1333 zua_out (:,:,:) = ua (:,:,:) 1334 zva_out (:,:,:) = va (:,:,:) 1336 1335 !-------------------------------------------------------------------- 1337 1336 ! Compute the Linearization Error … … 1474 1473 !!====================================================================== 1475 1474 #endif 1475 #endif 1476 1476 END MODULE dynhpg_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynldf_bilap_tam.F90
r1885 r2587 471 471 DO jj = jpjm1, 2, -1 472 472 DO ji = fs_jpim1, fs_2, -1 ! vector opt. 473 rotb_ad (ji ,jj ,jk) = rotb_ad (ji ,jj ,jk) & 474 & + zlvad(ji,jj,jk) * fse3f(ji,jj ,jk) / ( e1v(ji,jj) * fse3v(ji,jj,jk) ) 475 rotb_ad (ji-1,jj ,jk) = rotb_ad (ji-1,jj ,jk) & 476 & - zlvad(ji,jj,jk) * fse3f(ji-1,jj,jk) / ( e1v(ji,jj) * fse3v(ji,jj,jk) ) 473 zufad (ji ,jj ,jk) = zufad (ji ,jj ,jk) + zlvad(ji ,jj ,jk) / ( e1v(ji,jj) * fse3v(ji,jj,jk) ) 474 zufad (ji-1,jj ,jk) = zufad (ji-1,jj ,jk) - zlvad(ji ,jj ,jk) / ( e1v(ji,jj) * fse3v(ji,jj,jk) ) 477 475 hdivb_ad(ji ,jj ,jk) = hdivb_ad(ji ,jj ,jk) - zlvad(ji,jj,jk) / e2v(ji,jj) 478 476 hdivb_ad(ji ,jj+1,jk) = hdivb_ad(ji ,jj+1,jk) + zlvad(ji,jj,jk) / e2v(ji,jj) 479 477 zlvad(ji,jj,jk) = 0.0_wp 480 478 481 rotb_ad (ji ,jj ,jk) = rotb_ad (ji ,jj ,jk) & 482 & - zluad(ji,jj,jk) * fse3f(ji,jj ,jk) / ( e2u(ji,jj) * fse3u(ji,jj,jk) ) 483 rotb_ad (ji ,jj-1,jk) = rotb_ad (ji ,jj-1,jk) & 484 & + zluad(ji,jj,jk) * fse3f(ji,jj-1,jk) / ( e2u(ji,jj) * fse3u(ji,jj,jk) ) 479 zufad (ji ,jj ,jk) = zufad (ji ,jj ,jk) - zluad(ji ,jj ,jk) / ( e2u(ji,jj) * fse3u(ji,jj,jk) ) 480 zufad (ji ,jj-1,jk) = zufad (ji ,jj-1,jk) + zluad(ji ,jj ,jk) / ( e2u(ji,jj) * fse3u(ji,jj,jk) ) 485 481 hdivb_ad(ji ,jj ,jk) = hdivb_ad(ji ,jj ,jk) - zluad(ji,jj,jk) / e1u(ji,jj) 486 482 hdivb_ad(ji+1,jj ,jk) = hdivb_ad(ji+1,jj ,jk) + zluad(ji,jj,jk) / e1u(ji,jj) … … 488 484 END DO 489 485 END DO 490 ! DO jj = 1, jpj 491 ! DO ji = 1, jpi 492 ! rotb_ad(ji,jj,jk) = rotb_ad(ji,jj,jk) + zufad(ji,jj,jk) * fse3f(ji,jj,jk) 493 ! zufad(ji,jj,jk) = 0.0_wp 494 ! END DO 495 ! END DO 486 rotb_ad(:,:,jk) = rotb_ad(:,:,jk) + zufad(:,:,jk) * fse3f(:,:,jk) 496 487 ELSE ! z-coordinate - full step 497 488 DO jj = jpjm1, 2, -1 … … 501 492 hdivb_ad(ji ,jj ,jk) = hdivb_ad(ji ,jj ,jk) - zlvad(ji,jj,jk) / e2v(ji,jj) 502 493 hdivb_ad(ji ,jj+1,jk) = hdivb_ad(ji ,jj+1,jk) + zlvad(ji,jj,jk) / e2v(ji,jj) 503 !zlvad(ji,jj,jk) = 0.0_wp494 zlvad(ji,jj,jk) = 0.0_wp 504 495 505 496 rotb_ad (ji ,jj ,jk) = rotb_ad (ji ,jj ,jk) - zluad(ji,jj,jk) / e2u(ji,jj) … … 507 498 hdivb_ad(ji ,jj ,jk) = hdivb_ad(ji ,jj ,jk) - zluad(ji,jj,jk) / e1u(ji,jj) 508 499 hdivb_ad(ji+1,jj ,jk) = hdivb_ad(ji+1,jj ,jk) + zluad(ji,jj,jk) / e1u(ji,jj) 509 !zlvad(ji,jj,jk) = 0.0_wp500 zlvad(ji,jj,jk) = 0.0_wp 510 501 END DO 511 502 END DO -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynldf_tam.F90
r1885 r2587 287 287 & ji, & ! dummy loop indices 288 288 & jj, & 289 & jk 289 & jk, & 290 & jt 290 291 INTEGER, DIMENSION(jpi,jpj) :: & 291 292 & iseed_2d ! 2D seed for the random number generator … … 341 342 & ) 342 343 344 DO jt = 1, 2 345 346 IF (jt == 1) nldf=0 ! iso-level laplacian 347 IF (jt == 2) nldf=2 ! iso-level bilaplacian 348 343 349 !================================================================== 344 350 ! 1) dx = ( ua_tl, va_tl, rotb_tl, hdivb_tl ) … … 426 432 va_tl (:,:,:) = zva_tlin (:,:,:) 427 433 428 CALL dyn_ldf_tan ( nit000 ) 434 IF (nldf == 0 ) CALL dyn_ldf_lap_tan( nit000 ) 435 IF (nldf == 2 ) CALL dyn_ldf_bilap_tan( nit000 ) 429 436 430 437 zua_tlout(:,:,:) = ua_tl(:,:,:) … … 463 470 va_ad(:,:,:) = zva_adin(:,:,:) 464 471 465 CALL dyn_ldf_adj ( nit000 ) 472 IF (nldf == 0 ) CALL dyn_ldf_lap_adj( nit000 ) 473 IF (nldf == 2 ) CALL dyn_ldf_bilap_adj( nit000 ) 466 474 467 475 zua_adout (:,:,:) = ua_ad (:,:,:) … … 482 490 ! Compare the scalar products 483 491 ! 14 char:'12345678901234' 484 cl_name = 'dyn_ldf_adj ' 492 IF (nldf == 0 ) cl_name = 'dynldf_adj lap' 493 IF (nldf == 2 ) cl_name = 'dynldf_adj blp' 485 494 CALL prntst_adj( cl_name, kumadt, zsp1, zsp2 ) 495 496 END DO 486 497 487 498 DEALLOCATE( & -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynspg_flt_tam.F90
r1885 r2587 178 178 & stdemp, & 179 179 & stdssh, & 180 & stdgc, & 180 181 & prntst_adj, & 181 182 & prntst_tlm … … 187 188 PUBLIC dyn_spg_flt_tan, & ! routine called by step_tan.F90 188 189 & dyn_spg_flt_adj, & ! routine called by step_adj.F90 189 & dyn_spg_flt_adj_tst, & ! routine called by the tst.F90 190 & dyn_spg_flt_tlm_tst 191 190 & dyn_spg_flt_adj_tst ! routine called by the tst.F90 191 #if defined key_tst_tlm 192 PUBLIC dyn_spg_flt_tlm_tst 193 #endif 192 194 !! * Substitutions 193 195 # include "domzgr_substitute.h90" … … 1395 1397 END SUBROUTINE dyn_spg_flt_adj_tst 1396 1398 1397 1399 #if defined key_tst_tlm 1398 1400 SUBROUTINE dyn_spg_flt_tlm_tst( kumadt ) 1399 1401 !!----------------------------------------------------------------------- … … 1430 1432 USE tamtrj ! writing out state trajectory 1431 1433 USE par_tlm, ONLY: & 1434 & tlm_bch, & 1432 1435 & cur_loop, & 1433 1436 & h_ratio … … 1438 1441 USE oce , ONLY: & ! ocean dynamics and tracers variables 1439 1442 & ua, va, ub, vb, & 1443 & un, vn, & 1440 1444 & sshb, sshn, wn 1441 1445 USE sbc_oce , ONLY: & 1442 1446 & emp 1447 USE sol_oce , ONLY: & ! ocean dynamics and tracers variables 1448 & gcb, gcx 1443 1449 USE tamctl, ONLY: & ! Control parameters 1444 1450 & numtan, numtan_sc … … 1469 1475 & zsshn_wop, & 1470 1476 & z2r ! 2D field 1477 REAL(KIND=wp), DIMENSION(:,:), ALLOCATABLE :: & 1478 & zgcb_tlin , & ! Tangent input 1479 & zgcx_tlin , & ! Tangent input 1480 & zgcb_out , & ! Direct output 1481 & zgcx_out , & ! Direct output 1482 & zgcb_wop , & ! Direct output without perturbation 1483 & zgcx_wop , & ! Direct output without perturbation 1484 & zr ! 3D random field 1471 1485 REAL(KIND=wp) :: & 1472 1486 & zsp1, zsp1_1, zsp1_2, zsp1_3, zsp1_4, & ! … … 1475 1489 & zzsp, zzsp_1, zzsp_2, zzsp_3, zzsp_4, & 1476 1490 & gamma, & 1491 & zsp_5,zsp1_5, zsp2_5, zsp3_5, zsp4_5, & 1492 & zzsp_5, zsp_6, & 1477 1493 & zgsp1, zgsp2, zgsp3, zgsp4, zgsp5, & 1478 1494 & zgsp6, zgsp7 … … 1485 1501 & jk 1486 1502 CHARACTER(LEN=14) :: cl_name 1487 CHARACTER (LEN=128) :: file_out, file_wop 1503 CHARACTER (LEN=128) :: file_out, file_wop, file_xdx 1488 1504 CHARACTER (LEN=90) :: FMT 1489 1505 REAL(KIND=wp), DIMENSION(100):: & … … 1492 1508 & zscsshb, zscsshn, & 1493 1509 & zscerrsshb, zscerrsshn 1510 REAL(KIND=wp), DIMENSION(jpi,jpj) :: & 1511 & zerrgcb, zerrgcx 1512 REAL(KIND=wp), DIMENSION(100):: & 1513 & zscgcb,zscgcx, & 1514 & zscerrgcb, zscerrgcx 1515 INTEGER, DIMENSION(100):: & 1516 & iiposgcb, ijposgcb, & 1517 & iiposgcx, ijposgcx 1494 1518 INTEGER, DIMENSION(100):: & 1495 1519 & iipossshb, iipossshn, iiposua, iiposva, & … … 1530 1554 & z2r(jpi,jpj) & 1531 1555 & ) 1556 ALLOCATE( & 1557 & zgcb_tlin( jpi,jpj), & 1558 & zgcx_tlin( jpi,jpj), & 1559 & zgcb_out ( jpi,jpj), & 1560 & zgcx_out ( jpi,jpj), & 1561 & zgcb_wop ( jpi,jpj), & 1562 & zgcx_wop ( jpi,jpj), & 1563 & zr( jpi,jpj) & 1564 & ) 1532 1565 !-------------------------------------------------------------------- 1533 1566 ! Reset variables … … 1562 1595 zerrsshb(:,:) = 0.0_wp 1563 1596 zerrsshn(:,:) = 0.0_wp 1597 1598 zgcb_tlin( :,:) = 0.0_wp 1599 zgcx_tlin( :,:) = 0.0_wp 1600 zgcb_out ( :,:) = 0.0_wp 1601 zgcx_out ( :,:) = 0.0_wp 1602 zgcb_wop ( :,:) = 0.0_wp 1603 zgcx_wop ( :,:) = 0.0_wp 1604 zr( :,:) = 0.0_wp 1564 1605 !-------------------------------------------------------------------- 1565 1606 ! Output filename Xn=F(X0) 1566 1607 !-------------------------------------------------------------------- 1567 file_wop='trj_wop_dynspg'1568 1608 CALL tlm_namrd 1569 1609 gamma = h_ratio 1610 file_wop='trj_wop_dynspg' 1611 file_xdx='trj_xdx_dynspg' 1570 1612 !-------------------------------------------------------------------- 1571 1613 ! Initialize the tangent input with random noise: dx … … 1630 1672 END DO 1631 1673 END DO 1674 CALL grid_rd_sd( 596035, zr, c_solver_pt, 0.0_wp, stdgc) 1675 DO jj = nldj, nlej 1676 DO ji = nldi, nlei 1677 zgcb_tlin(ji,jj) = zr(ji,jj) 1678 END DO 1679 END DO 1680 CALL grid_rd_sd( 264792, zr, c_solver_pt, 0.0_wp, stdgc) 1681 DO jj = nldj, nlej 1682 DO ji = nldi, nlei 1683 zgcx_tlin(ji,jj) = zr(ji,jj) 1684 END DO 1685 END DO 1632 1686 ENDIF 1633 1687 … … 1636 1690 !------------------------------------------------------------------- 1637 1691 CALL istate_p 1638 1639 1692 ! *** initialize the reference trajectory 1640 1693 ! ------------ 1641 1694 CALL trj_rea( nit000-1, 1 ) 1642 1695 CALL trj_rea( nit000, 1 ) 1643 1696 ua(:,:,:)=un(:,:,:) 1697 va(:,:,:)=vn(:,:,:) 1698 ub(:,:,:)=un(:,:,:) 1699 vb(:,:,:)=vn(:,:,:) 1700 gcx (:,:) = ua(:,:,1) / 10.0_wp 1701 gcb (:,:) = ua(:,:,3) / 10.0_wp 1644 1702 1645 1703 IF (( cur_loop .NE. 0) .OR. ( gamma .NE. 0.0_wp) )THEN … … 1667 1725 zsshn_tlin(:,:) = gamma * zsshn_tlin(:,:) 1668 1726 sshn(:,:) = sshn(:,:) + zsshn_tlin(:,:) 1727 1728 zgcb_tlin(:,:) = gamma * zgcb_tlin(:,:) 1729 gcb(:,:) = gcb(:,:) + zgcb_tlin(:,:) 1730 1731 zgcx_tlin(:,:) = gamma * zgcx_tlin(:,:) 1732 gcx(:,:) = gcx(:,:) + zgcx_tlin(:,:) 1669 1733 ENDIF 1670 1734 … … 1672 1736 ! Compute the direct model F(X0,t=n) = Xn 1673 1737 !-------------------------------------------------------------------- 1674 CALL dyn_spg_flt(nit000, indic) 1675 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 1738 IF ( tlm_bch /= 2 ) CALL dyn_spg_flt(nit000, indic) 1739 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 1740 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 1676 1741 !-------------------------------------------------------------------- 1677 1742 ! Compute the Tangent 1678 1743 !-------------------------------------------------------------------- 1679 IF ( cur_loop .NE. 0) THEN 1680 !-------------------------------------------------------------------- 1681 ! Storing data 1682 !-------------------------------------------------------------------- 1683 zua_out (:,:,:) = ua (:,:,:) 1684 zva_out (:,:,:) = va (:,:,:) 1685 zsshb_out(:,: ) = sshb (:,: ) 1686 zsshn_out(:,: ) = sshn (:,: ) 1744 IF ( tlm_bch == 2 ) THEN 1745 gcx_tl (:,:) = 0.0_wp 1746 gcxb_tl(:,:) = 0.0_wp 1747 gcb_tl (:,:) = 0.0_wp 1687 1748 !-------------------------------------------------------------------- 1688 1749 ! Initialize the tangent variables … … 1698 1759 sshb_tl(:,: ) = zsshb_tlin(:,: ) 1699 1760 sshn_tl(:,: ) = zsshn_tlin(:,: ) 1761 gcb_tl (:,:) = zgcb_tlin (:,:) 1762 gcx_tl (:,:) = zgcx_tlin (:,:) 1700 1763 1701 1764 CALL dyn_spg_flt_tan(nit000, indic) … … 1708 1771 zsp2_3 = DOT_PRODUCT( sshb_tl, sshb_tl ) 1709 1772 zsp2_4 = DOT_PRODUCT( sshn_tl, sshn_tl ) 1710 zsp2 = zsp2_1 + zsp2_2 + zsp2_3 + zsp2_4 1773 zsp_5 = DOT_PRODUCT( gcx_tl, gcx_tl ) 1774 zsp_6 = DOT_PRODUCT( gcxb_tl, gcxb_tl ) 1775 1776 zsp2 = zsp2_1 + zsp2_2 + zsp2_3 + zsp2_4 + zsp_5 + zsp_6 1711 1777 !-------------------------------------------------------------------- 1712 1778 ! Storing data … … 1717 1783 zsshb_wop(:,:) = sshb(:,:) 1718 1784 zsshn_wop(:,:) = sshn(:,:) 1785 zgcx_wop (:,:) = gcx (:,:) 1786 CALL trj_rd_spl(file_xdx) 1787 zua_out (:,:,:) = ua (:,:,:) 1788 zva_out (:,:,:) = va (:,:,:) 1789 zsshb_out(:,:) = sshb(:,:) 1790 zsshn_out(:,:) = sshn(:,:) 1791 zgcx_out (:,:) = gcx (:,:) 1719 1792 !-------------------------------------------------------------------- 1720 1793 ! Compute the Linearization Error … … 1809 1882 END DO 1810 1883 END DO 1884 ii=0 1885 DO jj = 1, jpj 1886 DO ji = 1, jpi 1887 zgcx_out (ji,jj) = zgcx_out (ji,jj) - zgcx_wop (ji,jj) 1888 zgcx_wop (ji,jj) = zgcx_out (ji,jj) - gcx_tl (ji,jj) 1889 IF ( gcx_tl(ji,jj) .NE. 0.0_wp ) zerrgcx(ji,jj) = zgcx_out(ji,jj)/gcx_tl(ji,jj) 1890 IF( (MOD(ji, isamp) .EQ. 0) .AND. & 1891 & (MOD(jj, jsamp) .EQ. 0) ) THEN 1892 ii = ii+1 1893 iiposgcx(ii) = ji 1894 ijposgcx(ii) = jj 1895 IF ( INT(tmask(ji,jj,1)) .NE. 0) THEN 1896 zscgcx (ii) = zgcx_wop(ji,jj) 1897 zscerrgcx (ii) = ( zerrgcx(ji,jj) - 1.0_wp ) / gamma 1898 ENDIF 1899 ENDIF 1900 END DO 1901 END DO 1811 1902 zsp1_1 = DOT_PRODUCT( zua_out, zua_out ) 1812 1903 zsp1_2 = DOT_PRODUCT( zva_out, zva_out ) 1813 1904 zsp1_3 = DOT_PRODUCT( zsshb_out, zsshb_out ) 1814 1905 zsp1_4 = DOT_PRODUCT( zsshn_out, zsshn_out ) 1815 zsp1 = zsp1_1 + zsp1_2 + zsp1_3 + zsp1_4 1906 zsp1_5 = DOT_PRODUCT( zgcx_out, zgcx_out ) 1907 zsp1 = zsp1_1 + zsp1_2 + zsp1_3 + zsp1_4 + zsp1_5 1816 1908 zsp3_1 = DOT_PRODUCT( zua_wop, zua_wop ) 1817 1909 zsp3_2 = DOT_PRODUCT( zva_wop, zva_wop ) 1818 1910 zsp3_3 = DOT_PRODUCT( zsshb_wop, zsshb_wop ) 1819 1911 zsp3_4 = DOT_PRODUCT( zsshn_wop, zsshn_wop ) 1820 zsp3 = zsp3_1 + zsp3_2 + zsp3_3 + zsp3_4 1912 zsp3_5 = DOT_PRODUCT( zgcx_wop, zgcx_wop ) 1913 zsp3 = zsp3_1 + zsp3_2 + zsp3_3 + zsp3_4 + zsp3_5 1821 1914 1822 1915 !-------------------------------------------------------------------- … … 1830 1923 zzsp_3 = SQRT(zsp3_3) 1831 1924 zzsp_4 = SQRT(zsp3_4) 1925 zzsp_5 = SQRT(zsp3_5) 1832 1926 zgsp5 = zzsp 1833 1927 CALL prntst_tlm( cl_name, kumadt, zzsp, h_ratio ) … … 1840 1934 zzsp_3 = SQRT(zsp2_3) 1841 1935 zzsp_4 = SQRT(zsp2_4) 1936 zzsp_5 = SQRT(zsp2_5) 1842 1937 zgsp4 = zzsp 1843 1938 cl_name = 'dynspg_tam:Ln2' … … 1851 1946 zzsp_3 = SQRT(zsp1_3) 1852 1947 zzsp_4 = SQRT(zsp1_4) 1948 zzsp_5 = SQRT(zsp1_5) 1853 1949 cl_name = 'dynspg:Mhdx-Mx' 1854 1950 CALL prntst_tlm( cl_name, kumadt, zzsp, h_ratio ) … … 1918 2014 END SUBROUTINE dyn_spg_flt_tlm_tst 1919 2015 #endif 1920 2016 #endif 1921 2017 #endif 1922 2018 END MODULE dynspg_flt_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynspg_tam.F90
r1885 r2587 58 58 PUBLIC dyn_spg_tan, & ! routine called by steptan module 59 59 & dyn_spg_adj, & ! routine called by stepadj module 60 & dyn_spg_adj_tst, & ! routine controlling adjoint tests 61 & dyn_spg_tlm_tst 60 & dyn_spg_adj_tst ! routine controlling adjoint tests 61 #if defined key_tst_tlm 62 PUBLIC dyn_spg_tlm_tst 63 #endif 62 64 63 65 !! * module variables … … 262 264 263 265 END SUBROUTINE dyn_spg_ctl_tam 264 266 #if defined key_tst_tlm 265 267 SUBROUTINE dyn_spg_tlm_tst( kumadt ) 266 268 !!----------------------------------------------------------------------- … … 310 312 !!====================================================================== 311 313 #endif 314 #endif 312 315 END MODULE dynspg_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynvor_tam.F90
r1885 r2587 19 19 !! 9.0 ! 08-06 (A. Vidard) Skeleton 20 20 !! 9.0 ! 09-01 (A. Vidard) TAM of the 06-11 version 21 !! 9.0 ! 10-01 (F. Vigilant) Add een TAM option 21 22 !!---------------------------------------------------------------------- 22 23 … … 68 69 & e3t_0, & 69 70 #else 71 & e3t, & 70 72 & e3u, & 71 73 & e3v, & … … 81 83 & nlej, & 82 84 & umask, & 83 & vmask 85 & vmask, & 86 & tmask 84 87 USE dynadv , ONLY: & 85 88 & ln_dynadv_vec ! vector form flag 89 USE lbclnk , ONLY: & ! Lateral boundary conditions 90 & lbc_lnk 86 91 USE in_out_manager, ONLY: & ! I/O manager 87 92 & ctl_stop, & … … 146 151 ! 147 152 CASE ( -1 ) ! esopa: test all possibility with control print 148 !CALL vor_ene_tan( kt, ntot, ua_tl, va_tl )153 CALL vor_ene_tan( kt, ntot, ua_tl, va_tl ) 149 154 CALL vor_ens_tan( kt, ntot, ua_tl, va_tl ) 150 155 ! CALL vor_mix_tan( kt ) 151 !CALL vor_een_tan( kt, ntot, ua_tl, va_tl )156 CALL vor_een_tan( kt, ntot, ua_tl, va_tl ) 152 157 ! 153 158 CASE ( 0 ) ! energy conserving scheme 154 CALL ctl_stop ('vor_ene_tan not available yet') 155 ! CALL vor_ene_tan( kt, ntot, ua_tl, va_tl ) ! total vorticity 159 CALL vor_ene_tan( kt, ntot, ua_tl, va_tl ) ! total vorticity 156 160 ! 157 161 CASE ( 1 ) ! enstrophy conserving scheme … … 163 167 ! 164 168 CASE ( 3 ) ! energy and enstrophy conserving scheme 165 CALL ctl_stop ('vor_een_tan not available yet') 166 ! CALL vor_een_tan( kt, ntot, ua_tl, va_tl ) ! total vorticity 169 CALL vor_een_tan( kt, ntot, ua_tl, va_tl ) ! total vorticity 167 170 ! 168 171 END SELECT 169 172 170 173 END SUBROUTINE dyn_vor_tan 174 SUBROUTINE vor_ene_tan( kt, kvor, pua_tl, pva_tl ) 175 !!---------------------------------------------------------------------- 176 !! *** ROUTINE vor_ene *** 177 !! 178 !! ** Purpose : Compute the now total vorticity trend and add it to 179 !! the general trend of the momentum equation. 180 !! 181 !! ** Method : Trend evaluated using now fields (centered in time) 182 !! and the Sadourny (1975) flux form formulation : conserves the 183 !! horizontal kinetic energy. 184 !! The trend of the vorticity term is given by: 185 !! * s-coordinate (ln_sco=T), the e3. are inside the derivatives: 186 !! voru = 1/e1u mj-1[ (rotn+f)/e3f mi(e1v*e3v vn) ] 187 !! vorv = 1/e2v mi-1[ (rotn+f)/e3f mj(e2u*e3u un) ] 188 !! * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 189 !! voru = 1/e1u mj-1[ (rotn+f) mi(e1v vn) ] 190 !! vorv = 1/e2v mi-1[ (rotn+f) mj(e2u un) ] 191 !! Add this trend to the general momentum trend (ua,va): 192 !! (ua,va) = (ua,va) + ( voru , vorv ) 193 !! 194 !! ** Action : - Update (ua,va) with the now vorticity term trend 195 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative 196 !! and planetary vorticity trends) ('key_trddyn') 197 !! 198 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 199 !!---------------------------------------------------------------------- 200 INTEGER , INTENT(in ) :: kt ! ocean time-step index 201 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; 202 ! ! =nrvm (relative vorticity or metric) 203 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua_tl ! total u-trend 204 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pva_tl ! total v-trend 205 !! 206 INTEGER :: ji, jj, jk ! dummy loop indices 207 REAL(wp) :: zx1, zy1, zfact2 ! temporary scalars 208 REAL(wp) :: zx2, zy2 ! " " 209 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz ! temporary 2D workspace 210 REAL(wp) :: zx1tl, zy1tl ! temporary scalars 211 REAL(wp) :: zx2tl, zy2tl ! " " 212 REAL(wp), DIMENSION(jpi,jpj) :: zwxtl, zwytl, zwztl ! temporary 2D workspace 213 !!---------------------------------------------------------------------- 214 215 IF( kt == nit000 ) THEN 216 IF(lwp) WRITE(numout,*) 217 IF(lwp) WRITE(numout,*) 'dyn:vor_ene : vorticity term: energy conserving scheme' 218 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 219 ENDIF 220 221 ! Local constant initialization 222 zfact2 = 0.5 * 0.5 223 224 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz ) 225 ! ! =============== 226 DO jk = 1, jpkm1 ! Horizontal slab 227 ! ! =============== 228 ! Potential vorticity and horizontal fluxes 229 ! ----------------------------------------- 230 SELECT CASE( kvor ) ! vorticity considered 231 CASE ( 1 ) ; zwz(:,:) = ff(:,:) ! planetary vorticity (Coriolis) 232 CASE ( 2 ) ; zwz(:,:) = rotn(:,:,jk) ! relative vorticity 233 CASE ( 3 ) ! metric term 234 DO jj = 1, jpjm1 235 DO ji = 1, fs_jpim1 ! vector opt. 236 zwz(ji,jj) = ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 237 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 238 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) 239 END DO 240 END DO 241 CASE ( 4 ) ; zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) ! total (relative + planetary vorticity) 242 CASE ( 5 ) ! total (coriolis + metric) 243 DO jj = 1, jpjm1 244 DO ji = 1, fs_jpim1 ! vector opt. 245 zwz(ji,jj) = ( ff (ji,jj) & 246 & + ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 247 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 248 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) & 249 & ) 250 END DO 251 END DO 252 END SELECT 253 IF( ln_sco ) THEN 254 zwz(:,:) = zwz(:,:) / fse3f(:,:,jk) 255 zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 256 zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk) 257 ELSE 258 zwx(:,:) = e2u(:,:) * un(:,:,jk) 259 zwy(:,:) = e1v(:,:) * vn(:,:,jk) 260 ENDIF 261 262 263 ! Tangent counterpart 264 SELECT CASE( kvor ) ! vorticity considered 265 CASE ( 1 ) ; zwztl(:,:) = 0. ! planetary vorticity (Coriolis) 266 CASE ( 2 ) ; zwztl(:,:) = rotn_tl(:,:,jk) ! relative vorticity 267 CASE ( 3 ) ! metric term 268 DO jj = 1, jpjm1 269 DO ji = 1, fs_jpim1 ! vector opt. 270 zwztl(ji,jj) = ( ( vn_tl(ji+1,jj ,jk) + vn_tl (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 271 & - ( un_tl(ji ,jj+1,jk) + un_tl (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 272 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) 273 END DO 274 END DO 275 CASE ( 4 ) ; zwztl(:,:) = rotn_tl(:,:,jk) ! total (relative + planetary vorticity) 276 CASE ( 5 ) ! total (coriolis + metric) 277 DO jj = 1, jpjm1 278 DO ji = 1, fs_jpim1 ! vector opt. 279 zwztl(ji,jj) = ( ( vn_tl(ji+1,jj ,jk) + vn_tl (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 280 & - ( un_tl(ji ,jj+1,jk) + un_tl(ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 281 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) 282 283 END DO 284 END DO 285 END SELECT 286 287 IF( ln_sco ) THEN 288 zwztl(:,:) = zwztl(:,:) / fse3f(:,:,jk) 289 zwxtl(:,:) = e2u(:,:) * fse3u(:,:,jk) * un_tl(:,:,jk) 290 zwytl(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn_tl(:,:,jk) 291 ELSE 292 zwxtl(:,:) = e2u(:,:) * un_tl(:,:,jk) 293 zwytl(:,:) = e1v(:,:) * vn_tl(:,:,jk) 294 ENDIF 295 296 ! Compute and add the vorticity term trend 297 ! ---------------------------------------- 298 DO jj = 2, jpjm1 299 DO ji = fs_2, fs_jpim1 ! vector opt. 300 zy1 = zwy(ji,jj-1) + zwy(ji+1,jj-1) 301 zy2 = zwy(ji,jj ) + zwy(ji+1,jj ) 302 zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1) 303 zx2 = zwx(ji ,jj) + zwx(ji ,jj+1) 304 zy1tl = zwytl(ji,jj-1) + zwytl(ji+1,jj-1) 305 zy2tl = zwytl(ji,jj ) + zwytl(ji+1,jj ) 306 zx1tl = zwxtl(ji-1,jj) + zwxtl(ji-1,jj+1) 307 zx2tl = zwxtl(ji ,jj) + zwxtl(ji ,jj+1) 308 pua_tl(ji,jj,jk) = pua_tl(ji,jj,jk) + zfact2 / e1u(ji,jj) * ( zwztl(ji ,jj-1) * zy1 + zwz(ji ,jj-1) * zy1tl + zwztl(ji,jj) * zy2 + zwz(ji,jj) * zy2tl ) 309 pva_tl(ji,jj,jk) = pva_tl(ji,jj,jk) - zfact2 / e2v(ji,jj) * ( zwztl(ji-1,jj ) * zx1 + zwz(ji-1,jj ) * zx1tl + zwztl(ji,jj) * zx2 + zwz(ji,jj) * zx2tl ) 310 END DO 311 END DO 312 ! ! =============== 313 END DO ! End of slab 314 ! ! =============== 315 END SUBROUTINE vor_ene_tan 171 316 SUBROUTINE vor_ens_tan( kt, kvor, pua_tl, pva_tl ) 172 317 !!---------------------------------------------------------------------- … … 340 485 END SUBROUTINE vor_ens_tan 341 486 487 SUBROUTINE vor_een_tan( kt, kvor, pua_tl, pva_tl ) 488 !!---------------------------------------------------------------------- 489 !! *** ROUTINE vor_een_tan *** 490 !! 491 !! ** Purpose : Compute the now total vorticity trend and add it to 492 !! the general trend of the momentum equation. 493 !! 494 !! ** Method : Trend evaluated using now fields (centered in time) 495 !! and the Arakawa and Lamb (19XX) flux form formulation : conserves 496 !! both the horizontal kinetic energy and the potential enstrophy 497 !! when horizontal divergence is zero. 498 !! The trend of the vorticity term is given by: 499 !! * s-coordinate (ln_sco=T), the e3. are inside the derivatives: 500 !! * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 501 !! Add this trend to the general momentum trend (ua,va): 502 !! (ua,va) = (ua,va) + ( voru , vorv ) 503 !! 504 !! ** Action : - Update (ua,va) with the now vorticity term trend 505 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative 506 !! and planetary vorticity trends) ('key_trddyn') 507 !! 508 !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 509 !!---------------------------------------------------------------------- 510 INTEGER , INTENT(in ) :: kt ! ocean time-step index 511 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; 512 ! ! =nrvm (relative vorticity or metric) 513 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua_tl ! total u-trend 514 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pva_tl ! total v-trend 515 !! 516 INTEGER :: ji, jj, jk ! dummy loop indices 517 REAL(wp) :: zfac12, zua, zva ! temporary scalars 518 REAL(wp) :: zuatl, zvatl ! temporary scalars 519 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz ! temporary 2D workspace 520 REAL(wp), DIMENSION(jpi,jpj) :: ztnw, ztne, ztsw, ztse ! temporary 3D workspace 521 REAL(wp), DIMENSION(jpi,jpj) :: zwxtl, zwytl, zwztl ! temporary 2D workspace 522 REAL(wp), DIMENSION(jpi,jpj) :: ztnwtl, ztnetl, ztswtl, ztsetl ! temporary 3D workspace 523 REAL(wp), DIMENSION(jpi,jpj,jpk), SAVE :: ze3f 524 !!---------------------------------------------------------------------- 525 526 IF( kt == nit000 ) THEN 527 IF(lwp) WRITE(numout,*) 528 IF(lwp) WRITE(numout,*) 'dyn:vor_een_tam : vorticity term: energy and enstrophy conserving scheme' 529 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 530 531 DO jk = 1, jpk 532 DO jj = 1, jpjm1 533 DO ji = 1, jpim1 534 ze3f(ji,jj,jk) = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk) & 535 & + fse3t(ji,jj ,jk)*tmask(ji,jj ,jk) + fse3t(ji+1,jj ,jk)*tmask(ji+1,jj ,jk) ) * 0.25_wp 536 IF( ze3f(ji,jj,jk) /= 0.0_wp ) ze3f(ji,jj,jk) = 1.0_wp / ze3f(ji,jj,jk) 537 END DO 538 END DO 539 END DO 540 CALL lbc_lnk( ze3f, 'F', 1._wp ) 541 ENDIF 542 543 ! Local constant initialization 544 zfac12 = 1.0_wp / 12.0_wp 545 546 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz, ztnw, ztne, ztsw, ztse ) 547 ! ! =============== 548 DO jk = 1, jpkm1 ! Horizontal slab 549 ! ! =============== 550 551 ! Potential vorticity and horizontal fluxes 552 ! ----------------------------------------- 553 SELECT CASE( kvor ) ! vorticity considered 554 CASE ( 1 ) 555 zwz(:,:) = ff(:,:) * ze3f(:,:,jk) ! planetary vorticity (Coriolis) 556 zwztl(:,:) = 0.0_wp 557 CASE ( 2 ) 558 zwz(:,:) = rotn(:,:,jk) * ze3f(:,:,jk) ! relative vorticity 559 zwztl(:,:) = rotn_tl(:,:,jk) * ze3f(:,:,jk) 560 CASE ( 3 ) ! metric term 561 DO jj = 1, jpjm1 562 DO ji = 1, fs_jpim1 ! vector opt. 563 zwz(ji,jj) = ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 564 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 565 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) * ze3f(ji,jj,jk) 566 END DO 567 END DO 568 DO jj = 1, jpjm1 569 DO ji = 1, fs_jpim1 ! vector opt. 570 zwztl(ji,jj) = ( ( vn_tl(ji+1,jj ,jk) + vn_tl (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 571 & - ( un_tl(ji ,jj+1,jk) + un_tl (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 572 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) * ze3f(ji,jj,jk) 573 END DO 574 END DO 575 CASE ( 4 ) 576 zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) * ze3f(:,:,jk) ! total (relative + planetary vorticity) 577 zwztl(:,:) = ( rotn_tl(:,:,jk) ) * ze3f(:,:,jk) 578 CASE ( 5 ) ! total (coriolis + metric) 579 DO jj = 1, jpjm1 580 DO ji = 1, fs_jpim1 ! vector opt. 581 zwz(ji,jj) = ( ff (ji,jj) & 582 & + ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 583 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 584 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) & 585 & ) * ze3f(ji,jj,jk) 586 END DO 587 END DO 588 DO jj = 1, jpjm1 589 DO ji = 1, fs_jpim1 ! vector opt. 590 zwztl(ji,jj) = ( ( ( vn_tl(ji+1,jj ,jk) + vn_tl (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 591 & - ( un_tl(ji ,jj+1,jk) + un_tl (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 592 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) & 593 & ) * ze3f(ji,jj,jk) 594 END DO 595 END DO 596 END SELECT 597 598 zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 599 zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk) 600 601 zwxtl(:,:) = e2u(:,:) * fse3u(:,:,jk) * un_tl(:,:,jk) 602 zwytl(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn_tl(:,:,jk) 603 604 ! Compute and add the vorticity term trend 605 ! ---------------------------------------- 606 jj=2 607 ztne(1,:) = 0.0_wp ; ztnw(1,:) = 0.0_wp ; ztse(1,:) = 0.0_wp ; ztsw(1,:) = 0.0_wp 608 ztnetl(1,:) = 0.0_wp ; ztnwtl(1,:) = 0.0_wp ; ztsetl(1,:) = 0.0_wp ; ztswtl(1,:) = 0.0_wp 609 DO ji = 2, jpi 610 ztne(ji,jj) = zwz(ji-1,jj ) + zwz(ji ,jj ) + zwz(ji ,jj-1) 611 ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj ) + zwz(ji ,jj ) 612 ztse(ji,jj) = zwz(ji ,jj ) + zwz(ji ,jj-1) + zwz(ji-1,jj-1) 613 ztsw(ji,jj) = zwz(ji ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj ) 614 615 ztnetl(ji,jj) = zwztl(ji-1,jj ) + zwztl(ji ,jj ) + zwztl(ji ,jj-1) 616 ztnwtl(ji,jj) = zwztl(ji-1,jj-1) + zwztl(ji-1,jj ) + zwztl(ji ,jj ) 617 ztsetl(ji,jj) = zwztl(ji ,jj ) + zwztl(ji ,jj-1) + zwztl(ji-1,jj-1) 618 ztswtl(ji,jj) = zwztl(ji ,jj-1) + zwztl(ji-1,jj-1) + zwztl(ji-1,jj ) 619 END DO 620 DO jj = 3, jpj 621 DO ji = fs_2, jpi ! vector opt. 622 ztne(ji,jj) = zwz(ji-1,jj ) + zwz(ji ,jj ) + zwz(ji ,jj-1) 623 ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj ) + zwz(ji ,jj ) 624 ztse(ji,jj) = zwz(ji ,jj ) + zwz(ji ,jj-1) + zwz(ji-1,jj-1) 625 ztsw(ji,jj) = zwz(ji ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj ) 626 627 ztnetl(ji,jj) = zwztl(ji-1,jj ) + zwztl(ji ,jj ) + zwztl(ji ,jj-1) 628 ztnwtl(ji,jj) = zwztl(ji-1,jj-1) + zwztl(ji-1,jj ) + zwztl(ji ,jj ) 629 ztsetl(ji,jj) = zwztl(ji ,jj ) + zwztl(ji ,jj-1) + zwztl(ji-1,jj-1) 630 ztswtl(ji,jj) = zwztl(ji ,jj-1) + zwztl(ji-1,jj-1) + zwztl(ji-1,jj ) 631 END DO 632 END DO 633 DO jj = 2, jpjm1 634 DO ji = fs_2, fs_jpim1 ! vector opt. 635 zuatl = + zfac12 / e1u(ji,jj) * ( ztnetl(ji,jj ) * zwy(ji ,jj ) + ztne(ji,jj ) * zwytl(ji ,jj ) & 636 & + ztnwtl(ji+1,jj) * zwy(ji+1,jj ) + ztnw(ji+1,jj) * zwytl(ji+1,jj ) & 637 & + ztsetl(ji,jj ) * zwy(ji ,jj-1) + ztse(ji,jj ) * zwytl(ji ,jj-1) & 638 & + ztswtl(ji+1,jj) * zwy(ji+1,jj-1) + ztsw(ji+1,jj) * zwytl(ji+1,jj-1)) 639 640 zvatl = - zfac12 / e2v(ji,jj) * ( ztswtl(ji,jj+1) * zwx(ji-1,jj+1) + ztsw(ji,jj+1) * zwxtl(ji-1,jj+1) & 641 & + ztsetl(ji,jj+1) * zwx(ji ,jj+1) + ztse(ji,jj+1) * zwxtl(ji ,jj+1) & 642 & + ztnwtl(ji,jj ) * zwx(ji-1,jj ) + ztnw(ji,jj ) * zwxtl(ji-1,jj ) & 643 & + ztnetl(ji,jj ) * zwx(ji ,jj ) + ztne(ji,jj ) * zwxtl(ji ,jj ) ) 644 pua_tl(ji,jj,jk) = pua_tl(ji,jj,jk) + zuatl 645 pva_tl(ji,jj,jk) = pva_tl(ji,jj,jk) + zvatl 646 END DO 647 END DO 648 ! ! =============== 649 END DO ! End of slab 650 ! ! =============== 651 END SUBROUTINE vor_een_tan 652 653 342 654 SUBROUTINE dyn_vor_adj( kt ) 343 655 !!---------------------------------------------------------------------- … … 360 672 ! 361 673 CASE ( -1 ) ! esopa: test all possibility with control print 362 !CALL vor_een_adj( kt, ntot, ua_ad, va_ad )674 CALL vor_een_adj( kt, ntot, ua_ad, va_ad ) 363 675 ! CALL vor_mix_adj( kt ) 364 676 CALL vor_ens_adj( kt, ntot, ua_ad, va_ad ) … … 377 689 ! 378 690 CASE ( 3 ) ! energy and enstrophy conserving scheme 379 CALL ctl_stop ('vor_een_adj not available yet') 380 ! CALL vor_een_adj( kt, ntot, ua_ad, va_ad ) ! total vorticity 691 CALL vor_een_adj( kt, ntot, ua_ad, va_ad ) ! total vorticity 381 692 ! 382 693 END SELECT … … 417 728 !! 418 729 INTEGER :: ji, jj, jk ! dummy loop indices 419 REAL(wp) :: zfact1 , zuav, zvau! temporary scalars730 REAL(wp) :: zfact1 ! temporary scalars 420 731 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz ! temporary 3D workspace 732 REAL(wp) :: zuav, zvau ! temporary scalars 421 733 REAL(wp) :: zuavad, zvauad ! temporary scalars 422 734 REAL(wp), DIMENSION(jpi,jpj) :: zwxad, zwyad, zwzad ! temporary 3D workspace … … 581 893 END SUBROUTINE vor_ens_adj 582 894 895 896 SUBROUTINE vor_een_adj( kt, kvor, pua_ad, pva_ad ) 897 !!---------------------------------------------------------------------- 898 !! *** ROUTINE vor_een_adj *** 899 !! 900 !! ** Purpose : Compute the now total vorticity trend and add it to 901 !! the general trend of the momentum equation. 902 !! 903 !! ** Method : Trend evaluated using now fields (centered in time) 904 !! and the Arakawa and Lamb (19XX) flux form formulation : conserves 905 !! both the horizontal kinetic energy and the potential enstrophy 906 !! when horizontal divergence is zero. 907 !! The trend of the vorticity term is given by: 908 !! * s-coordinate (ln_sco=T), the e3. are inside the derivatives: 909 !! * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 910 !! Add this trend to the general momentum trend (ua,va): 911 !! (ua,va) = (ua,va) + ( voru , vorv ) 912 !! 913 !! ** Action : - Update (ua,va) with the now vorticity term trend 914 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative 915 !! and planetary vorticity trends) ('key_trddyn') 916 !! 917 !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 918 !!---------------------------------------------------------------------- 919 INTEGER , INTENT(in ) :: kt ! ocean time-step index 920 INTEGER , INTENT(in ) :: kvor ! =ncor (planetary) ; =ntot (total) ; 921 ! ! =nrvm (relative vorticity or metric) 922 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pua_ad ! total u-trend 923 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pva_ad ! total v-trend 924 !! 925 INTEGER :: ji, jj, jk ! dummy loop indices 926 REAL(wp) :: zfac12 ! temporary scalars 927 REAL(wp) :: zuaad, zvaad ! temporary scalars 928 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz ! temporary 2D workspace 929 REAL(wp), DIMENSION(jpi,jpj) :: ztnw, ztne, ztsw, ztse ! temporary 3D workspace 930 REAL(wp), DIMENSION(jpi,jpj) :: zwxad, zwyad, zwzad ! temporary 2D workspace 931 REAL(wp), DIMENSION(jpi,jpj) :: ztnwad, ztnead, ztswad, ztsead ! temporary 3D workspace 932 REAL(wp), DIMENSION(jpi,jpj,jpk), SAVE :: ze3f 933 !!---------------------------------------------------------------------- 934 935 ! local adjoint initailization 936 zuaad = 0.0_wp ; zvaad = 0.0_wp 937 zwxad (:,:) = 0.0_wp ; zwyad (:,:) = 0.0_wp ; zwzad (:,:) = 0.0_wp 938 ztnwad(:,:) = 0.0_wp ; ztnead(:,:) = 0.0_wp ; ztswad(:,:) = 0.0_wp ; ztsead(:,:) = 0.0_wp 939 940 IF( kt == nitend ) THEN 941 IF(lwp) WRITE(numout,*) 942 IF(lwp) WRITE(numout,*) 'dyn:vor_een_adj : vorticity term: energy and enstrophy conserving scheme' 943 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 944 945 DO jk = 1, jpk 946 DO jj = 1, jpjm1 947 DO ji = 1, jpim1 948 ze3f(ji,jj,jk) = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk) & 949 & + fse3t(ji,jj ,jk)*tmask(ji,jj ,jk) + fse3t(ji+1,jj ,jk)*tmask(ji+1,jj ,jk) ) * 0.25_wp 950 IF( ze3f(ji,jj,jk) /= 0.0_wp ) ze3f(ji,jj,jk) = 1.0_wp / ze3f(ji,jj,jk) 951 END DO 952 END DO 953 END DO 954 CALL lbc_lnk( ze3f, 'F', 1._wp ) 955 ENDIF 956 957 ! Local constant initialization 958 zfac12 = 1.0_wp / 12.0_wp 959 960 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz, ztnw, ztne, ztsw, ztse ) 961 ! ! =============== 962 DO jk = 1, jpkm1 ! Horizontal slab 963 ! ! =============== 964 965 ! Potential vorticity and horizontal fluxes (Direct local variables init) 966 ! ----------------------------------------- 967 SELECT CASE( kvor ) ! vorticity considered 968 CASE ( 1 ) ; zwz(:,:) = ff(:,:) * ze3f(:,:,jk) ! planetary vorticity (Coriolis) 969 CASE ( 2 ) ; zwz(:,:) = rotn(:,:,jk) * ze3f(:,:,jk) ! relative vorticity 970 CASE ( 3 ) ! metric term 971 DO jj = 1, jpjm1 972 DO ji = 1, fs_jpim1 ! vector opt. 973 zwz(ji,jj) = ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 974 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) )& 975 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) * ze3f(ji,jj,jk) 976 END DO 977 END DO 978 CASE ( 4 ) ; zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) * ze3f(:,:,jk) ! total (relative + planetary vorticity) 979 CASE ( 5 ) ! total (coriolis + metric) 980 DO jj = 1, jpjm1 981 DO ji = 1, fs_jpim1 ! vector opt. 982 zwz(ji,jj) = ( ff (ji,jj) & 983 & + ( ( vn(ji+1,jj ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) & 984 & - ( un(ji ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) ) & 985 & * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) & 986 & ) * ze3f(ji,jj,jk) 987 END DO 988 END DO 989 END SELECT 990 991 zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 992 zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk) 993 994 ! Compute and add the vorticity term trend 995 ! ---------------------------------------- 996 jj=2 997 ztne(1,:) = 0.0_wp ; ztnw(1,:) = 0.0_wp ; ztse(1,:) = 0.0_wp ; ztsw(1,:) = 0.0_wp 998 DO ji = 2, jpi 999 ztne(ji,jj) = zwz(ji-1,jj ) + zwz(ji ,jj ) + zwz(ji ,jj-1) 1000 ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj ) + zwz(ji ,jj ) 1001 ztse(ji,jj) = zwz(ji ,jj ) + zwz(ji ,jj-1) + zwz(ji-1,jj-1) 1002 ztsw(ji,jj) = zwz(ji ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj ) 1003 END DO 1004 DO jj = 3, jpj 1005 DO ji = fs_2, jpi ! vector opt. 1006 ztne(ji,jj) = zwz(ji-1,jj ) + zwz(ji ,jj ) + zwz(ji ,jj-1) 1007 ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj ) + zwz(ji ,jj ) 1008 ztse(ji,jj) = zwz(ji ,jj ) + zwz(ji ,jj-1) + zwz(ji-1,jj-1) 1009 ztsw(ji,jj) = zwz(ji ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj ) 1010 END DO 1011 END DO 1012 1013 ! =================== 1014 ! Adjoint counterpart 1015 ! =================== 1016 1017 DO jj = jpjm1, 2, -1 1018 DO ji = fs_jpim1, fs_2, -1 ! vector opt. 1019 zuaad = zuaad + pua_ad(ji,jj,jk) 1020 zvaad = zvaad + pva_ad(ji,jj,jk) 1021 1022 zvaad = - zvaad * zfac12 / e2v(ji,jj) 1023 ztswad(ji ,jj+1) = ztswad(ji ,jj+1) + zvaad * zwx (ji-1,jj+1) 1024 zwxad (ji-1,jj+1) = zwxad (ji-1,jj+1) + zvaad * ztsw(ji ,jj+1) 1025 ztsead(ji ,jj+1) = ztsead(ji ,jj+1) + zvaad * zwx (ji ,jj+1) 1026 zwxad (ji ,jj+1) = zwxad (ji ,jj+1) + zvaad * ztse(ji ,jj+1) 1027 ztnwad(ji ,jj ) = ztnwad(ji ,jj ) + zvaad * zwx (ji-1,jj ) 1028 zwxad (ji-1,jj ) = zwxad (ji-1,jj ) + zvaad * ztnw(ji ,jj ) 1029 ztnead(ji ,jj ) = ztnead(ji ,jj ) + zvaad * zwx (ji ,jj ) 1030 zwxad (ji ,jj ) = zwxad (ji ,jj ) + zvaad * ztne(ji ,jj ) 1031 zvaad = 0.0_wp 1032 1033 zuaad = zuaad * zfac12 / e1u(ji,jj) 1034 ztnead(ji ,jj ) = ztnead(ji ,jj ) + zuaad * zwy (ji ,jj ) 1035 zwyad (ji ,jj ) = zwyad (ji ,jj ) + zuaad * ztne(ji ,jj ) 1036 ztnwad(ji+1,jj ) = ztnwad(ji+1,jj ) + zuaad * zwy (ji+1,jj ) 1037 zwyad (ji+1,jj ) = zwyad (ji+1,jj ) + zuaad * ztnw(ji+1,jj ) 1038 ztsead(ji ,jj ) = ztsead(ji ,jj ) + zuaad * zwy (ji ,jj-1) 1039 zwyad (ji ,jj-1) = zwyad (ji ,jj-1) + zuaad * ztse(ji ,jj ) 1040 ztswad(ji+1,jj ) = ztswad(ji+1,jj ) + zuaad * zwy (ji+1,jj-1) 1041 zwyad (ji+1,jj-1) = zwyad (ji+1,jj-1) + zuaad * ztsw(ji+1,jj ) 1042 zuaad = 0.0_wp 1043 END DO 1044 END DO 1045 DO jj = jpj, 3, -1 1046 DO ji = jpi, fs_2, -1 ! vector opt. 1047 zwzad (ji ,jj-1) = zwzad(ji ,jj-1) + ztswad(ji,jj) 1048 zwzad (ji-1,jj-1) = zwzad(ji-1,jj-1) + ztswad(ji,jj) 1049 zwzad (ji-1,jj ) = zwzad(ji-1,jj ) + ztswad(ji,jj) 1050 ztswad(ji ,jj ) = 0.0_wp 1051 zwzad (ji ,jj ) = zwzad(ji ,jj ) + ztsead(ji,jj) 1052 zwzad (ji ,jj-1) = zwzad(ji ,jj-1) + ztsead(ji,jj) 1053 zwzad (ji-1,jj-1) = zwzad(ji-1,jj-1) + ztsead(ji,jj) 1054 ztsead(ji,jj) = 0.0_wp 1055 zwzad (ji-1,jj-1) = zwzad(ji-1,jj-1) + ztnwad(ji,jj) 1056 zwzad (ji-1,jj ) = zwzad(ji-1,jj ) + ztnwad(ji,jj) 1057 zwzad (ji ,jj ) = zwzad(ji ,jj ) + ztnwad(ji,jj) 1058 ztnwad(ji ,jj ) = 0.0_wp 1059 zwzad (ji-1,jj ) = zwzad(ji-1,jj ) + ztnead(ji,jj) 1060 zwzad (ji ,jj ) = zwzad(ji ,jj ) + ztnead(ji,jj) 1061 zwzad (ji ,jj-1) = zwzad(ji ,jj-1) + ztnead(ji,jj) 1062 ztnead(ji,jj) = 0.0_wp 1063 END DO 1064 END DO 1065 jj=2 1066 DO ji = jpi, 2, -1 1067 zwzad (ji ,jj-1) = zwzad(ji ,jj-1) + ztswad(ji,jj) 1068 zwzad (ji-1,jj-1) = zwzad(ji-1,jj-1) + ztswad(ji,jj) 1069 zwzad (ji-1,jj ) = zwzad(ji-1,jj ) + ztswad(ji,jj) 1070 ztswad(ji,jj) = 0.0_wp 1071 zwzad (ji ,jj ) = zwzad(ji ,jj ) + ztsead(ji,jj) 1072 zwzad (ji ,jj-1) = zwzad(ji ,jj-1) + ztsead(ji,jj) 1073 zwzad (ji-1,jj-1) = zwzad(ji-1,jj-1) + ztsead(ji,jj) 1074 ztsead(ji ,jj ) = 0.0_wp 1075 zwzad (ji-1,jj-1) = zwzad(ji-1,jj-1) + ztnwad(ji,jj) 1076 zwzad (ji-1,jj ) = zwzad(ji-1,jj ) + ztnwad(ji,jj) 1077 zwzad (ji ,jj ) = zwzad(ji ,jj ) + ztnwad(ji,jj) 1078 ztnwad(ji ,jj ) = 0.0_wp 1079 zwzad (ji-1,jj ) = zwzad(ji-1,jj ) + ztnead(ji,jj) 1080 zwzad (ji ,jj ) = zwzad(ji ,jj ) + ztnead(ji,jj) 1081 zwzad (ji ,jj-1) = zwzad(ji ,jj-1) + ztnead(ji,jj) 1082 ztnead(ji ,jj ) = 0.0_wp 1083 END DO 1084 ztnead(1,:) = 0.0_wp ; ztnwad(1,:) = 0.0_wp 1085 ztsead(1,:) = 0.0_wp ; ztswad(1,:) = 0.0_wp 1086 1087 vn_ad(:,:,jk) = vn_ad(:,:,jk) + zwyad(:,:) * e1v(:,:) * fse3v(:,:,jk) 1088 un_ad(:,:,jk) = un_ad(:,:,jk) + zwxad(:,:) * e2u(:,:) * fse3u(:,:,jk) 1089 zwyad(:,:) = 0.0_wp 1090 zwxad(:,:) = 0.0_wp 1091 1092 ! Potential vorticity and horizontal fluxes 1093 ! ----------------------------------------- 1094 SELECT CASE( kvor ) ! vorticity considered 1095 CASE ( 1 ) 1096 zwzad(:,:) = 0.0_wp 1097 CASE ( 2 ) 1098 rotn_ad(:,:,jk) = rotn_ad(:,:,jk) + zwzad(:,:) * ze3f(:,:,jk) 1099 zwzad(:,:) = 0.0_wp 1100 CASE ( 3 ) ! metric term 1101 DO jj = jpjm1, 1, -1 1102 DO ji = fs_jpim1, 1, -1 ! vector opt. 1103 zwzad(ji ,jj ) = zwzad(ji,jj) * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) * ze3f(ji,jj,jk) 1104 vn_ad(ji+1,jj ,jk) = vn_ad(ji+1,jj ,jk) + zwzad(ji,jj) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) 1105 vn_ad(ji ,jj ,jk) = vn_ad(ji ,jj ,jk) + zwzad(ji,jj) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) 1106 un_ad(ji ,jj+1,jk) = - un_ad(ji ,jj+1,jk) + zwzad(ji,jj) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) 1107 un_ad(ji ,jj ,jk) = - un_ad(ji ,jj ,jk) + zwzad(ji,jj) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) 1108 zwzad(ji ,jj ) = 0.0_wp 1109 END DO 1110 END DO 1111 CASE ( 4 ) 1112 rotn_ad(:,:,jk) = rotn_ad(:,:,jk) + zwzad(:,:) * ze3f(:,:,jk) 1113 zwzad(:,:) = 0.0_wp 1114 CASE ( 5 ) ! total (coriolis + metric) 1115 DO jj = jpjm1, 1, -1 1116 DO ji = fs_jpim1, 1, -1 ! vector opt. 1117 zwzad(ji ,jj ) = zwzad(ji,jj) * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) * ze3f(ji,jj,jk) 1118 1119 vn_ad(ji+1,jj ,jk) = vn_ad(ji+1,jj ,jk) + zwzad(ji,jj) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) 1120 vn_tl(ji ,jj ,jk) = vn_tl(ji ,jj ,jk) + zwzad(ji,jj) * ( e2v(ji+1,jj ) - e2v(ji,jj) ) 1121 un_ad(ji ,jj+1,jk) = un_ad(ji ,jj+1,jk) - zwzad(ji,jj) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) 1122 un_ad(ji ,jj ,jk) = un_ad(ji ,jj ,jk) - zwzad(ji,jj) * ( e1u(ji ,jj+1) - e1u(ji,jj) ) 1123 1124 zwzad(ji ,jj ) = 0.0_wp 1125 END DO 1126 END DO 1127 END SELECT 1128 ! ! =============== 1129 END DO ! End of slab 1130 ! ! =============== 1131 END SUBROUTINE vor_een_adj 1132 583 1133 SUBROUTINE vor_ctl_tam 584 1134 !!--------------------------------------------------------------------- … … 599 1149 WRITE(numout,*) 'dyn:vor_ctl_tam : vorticity term : read namelist and control the consistency' 600 1150 WRITE(numout,*) '~~~~~~~~~~~~~~~' 601 WRITE(numout,*) ' Namelist nam_dynvor : oice of the vorticity term scheme'1151 WRITE(numout,*) ' Namelist nam_dynvor : choice of the vorticity term scheme' 602 1152 WRITE(numout,*) ' energy conserving scheme ln_dynvor_ene = ', ln_dynvor_ene 603 1153 WRITE(numout,*) ' enstrophy conserving scheme ln_dynvor_ens = ', ln_dynvor_ens … … 679 1229 & ji, & ! dummy loop indices 680 1230 & jj, & 681 & jk 1231 & jk, & 1232 & jt 682 1233 INTEGER, DIMENSION(jpi,jpj) :: & 683 1234 & iseed_2d ! 2D seed for the random number generator … … 738 1289 & ) 739 1290 1291 ! init ntot parameter 1292 CALL vor_ctl_tam ! initialisation & control of options 1293 1294 DO jt = 1, 2 1295 IF (jt == 1) nvor=1 ! enstrophy conserving scheme 1296 IF (jt == 2) nvor=3 ! energy and enstrophy conserving scheme 1297 740 1298 ! Initialize rotn 741 1299 CALL div_cur ( nit000 ) … … 816 1374 END DO 817 1375 CALL grid_random( iseed_2d, zav, 'V', 0.0_wp, stdv ) 818 !zun_tlin(:,:,:) = znu(:,:,:) 819 !zvn_tlin(:,:,:) = znv(:,:,:) 820 !zua_tlin(:,:,:) = zau(:,:,:) 821 !zva_tlin(:,:,:) = zav(:,:,:) 1376 822 1377 DO jk = 1, jpk 823 1378 DO jj = nldj, nlej … … 837 1392 ! initialize rotn_tl with noise 838 1393 CALL div_cur_tan ( nit000 ) 839 !zrotn_tlin(:,:,:) = rotn_tl(:,:,:) 1394 840 1395 DO jk = 1, jpk 841 1396 DO jj = nldj, nlej … … 847 1402 rotn_tl(:,:,:) = zrotn_tlin(:,:,:) 848 1403 849 CALL dyn_vor_tan( nit000 ) 1404 1405 IF (nvor == 1 ) CALL vor_ens_tan( nit000, ntot, ua_tl, va_tl ) 1406 IF (nvor == 3 ) CALL vor_een_tan( nit000, ntot, ua_tl, va_tl ) 850 1407 zua_tlout(:,:,:) = ua_tl(:,:,:) 851 1408 zva_tlout(:,:,:) = va_tl(:,:,:) … … 882 1439 va_ad(:,:,:) = zva_adin(:,:,:) 883 1440 884 CALL dyn_vor_adj ( nitend ) 885 1441 1442 IF (nvor == 1 ) CALL vor_ens_adj( nitend, ntot, ua_ad, va_ad ) 1443 IF (nvor == 3 ) CALL vor_een_adj( nitend, ntot, ua_ad, va_ad ) 886 1444 zun_adout(:,:,:) = un_ad(:,:,:) 887 1445 zvn_adout(:,:,:) = vn_ad(:,:,:) … … 900 1458 901 1459 ! 14 char:'12345678901234' 902 cl_name = 'dyn_vor_adj ' 1460 IF (nvor == 1 ) cl_name = 'dynvor_adj ens' 1461 IF (nvor == 3 ) cl_name = 'dynvor_adj een' 1462 903 1463 CALL prntst_adj( cl_name, kumadt, zsp1, zsp2 ) 1464 END DO 904 1465 905 1466 DEALLOCATE( & -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynzad_tam.F90
r1885 r2587 131 131 DO jj = 2, jpjm1 ! Surface and bottom values set to zero 132 132 DO ji = fs_2, fs_jpim1 ! vector opt. 133 zwuwtl(ji,jj, 1 ) = 0. e0134 zwvwtl(ji,jj, 1 ) = 0. e0135 zwuwtl(ji,jj,jpk) = 0. e0136 zwvwtl(ji,jj,jpk) = 0. e0133 zwuwtl(ji,jj, 1 ) = 0.0_wp 134 zwvwtl(ji,jj, 1 ) = 0.0_wp 135 zwuwtl(ji,jj,jpk) = 0.0_wp 136 zwvwtl(ji,jj,jpk) = 0.0_wp 137 137 END DO 138 138 END DO … … 210 210 END DO 211 211 END DO 212 DO jj = 2, jpjm1 ! Surface and bottom values set to zero 213 DO ji = fs_2, fs_jpim1 ! vector opt. 214 zwuwad(ji,jj, 1 ) = 0.0_wp 215 zwvwad(ji,jj, 1 ) = 0.0_wp 216 zwuwad(ji,jj,jpk) = 0.0_wp 217 zwvwad(ji,jj,jpk) = 0.0_wp 218 END DO 219 END DO 212 220 DO jk = jpkm1, 2, -1 ! Vertical momentum advection at level w and u- and v- vertical 213 221 DO jj = 2, jpj ! vertical fluxes -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynzdf_exp_tam.F90
r1885 r2587 20 20 !! * Modules used 21 21 22 USE in_out_manager ! I/O manager 22 USE par_kind , ONLY: & ! Precision variables 23 & wp 24 USE par_oce , ONLY: & ! Ocean space and time domain variables 25 & jpi, & 26 & jpj, & 27 & jpk, & 28 & jpim1, & 29 & jpjm1, & 30 & jpkm1 31 USE oce_tam , ONLY: & ! ocean dynamics and tracers 32 & ub_tl, & 33 & vb_tl, & 34 & ua_tl, & 35 & va_tl, & 36 & ub_ad, & 37 & vb_ad, & 38 & ua_ad, & 39 & va_ad 40 USE zdf_oce , ONLY: & ! ocean vertical physics 41 & avmu, & 42 & avmv, & 43 & n_zdfexp 44 USE dom_oce , ONLY: & ! ocean space and time domain 45 #if defined key_zco 46 & e3t_0, & 47 & e3w_0, & 48 #else 49 & e3u, & 50 & e3v, & 51 & e3uw, & 52 & e3vw, & 53 #endif 54 & umask, & 55 & vmask 56 USE phycst , ONLY: & ! physical constants 57 & rau0 58 USE in_out_manager, ONLY: & ! I/O manager 59 & nit000, & 60 & nitend, & 61 & numout, & 62 & lwp, & 63 & ctl_stop 23 64 IMPLICIT NONE 24 65 PRIVATE … … 59 100 !! * Local declarations 60 101 INTEGER :: ji, jj, jk, jl ! dummy loop indices 61 REAL(wp) :: zrau0r, zlavmr, zua , zva! temporary scalars62 REAL(wp), DIMENSION(jpi,jpk) :: zwx , zwy, zwz, zww! temporary workspace arrays102 REAL(wp) :: zrau0r, zlavmr, zuatl, zvatl ! temporary scalars 103 REAL(wp), DIMENSION(jpi,jpk) :: zwxtl, zwytl, zwztl, zwwtl ! temporary workspace arrays 63 104 !!---------------------------------------------------------------------- 64 105 … … 68 109 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~ ' 69 110 ENDIF 70 71 CALL ctl_stop ('dyn_zdf_exp_tan not available yet') 111 ! Local constant initialization 112 ! ----------------------------- 113 zrau0r = 1. / rau0 ! inverse of the reference density 114 zlavmr = 1. / float( n_zdfexp ) ! inverse of the number of sub time step 115 116 ! ! =============== 117 DO jj = 2, jpjm1 ! Vertical slab 118 ! ! =============== 119 120 ! Surface boundary condition 121 DO ji = 2, jpim1 122 zwytl(ji,1) = 0.0_wp 123 zwwtl(ji,1) = 0.0_wp 124 END DO 125 126 ! Initialization of x, z and contingently trends array 127 DO jk = 1, jpk 128 DO ji = 2, jpim1 129 zwxtl(ji,jk) = ub_tl(ji,jj,jk) 130 zwztl(ji,jk) = vb_tl(ji,jj,jk) 131 END DO 132 END DO 133 134 ! Time splitting loop 135 DO jl = 1, n_zdfexp 136 137 ! First vertical derivative 138 DO jk = 2, jpk 139 DO ji = 2, jpim1 140 zwytl(ji,jk) = avmu(ji,jj,jk) * ( zwxtl(ji,jk-1) - zwxtl(ji,jk) ) / fse3uw(ji,jj,jk) 141 zwwtl(ji,jk) = avmv(ji,jj,jk) * ( zwztl(ji,jk-1) - zwztl(ji,jk) ) / fse3vw(ji,jj,jk) 142 END DO 143 END DO 144 145 ! Second vertical derivative and trend estimation at kt+l*rdt/n_zdfexp 146 DO jk = 1, jpkm1 147 DO ji = 2, jpim1 148 zuatl = zlavmr*( zwytl(ji,jk) - zwytl(ji,jk+1) ) / fse3u(ji,jj,jk) 149 zvatl = zlavmr*( zwwtl(ji,jk) - zwwtl(ji,jk+1) ) / fse3v(ji,jj,jk) 150 ua_tl(ji,jj,jk) = ua_tl(ji,jj,jk) + zuatl 151 va_tl(ji,jj,jk) = va_tl(ji,jj,jk) + zvatl 152 153 zwxtl(ji,jk) = zwxtl(ji,jk) + p2dt*zuatl*umask(ji,jj,jk) 154 zwztl(ji,jk) = zwztl(ji,jk) + p2dt*zvatl*vmask(ji,jj,jk) 155 END DO 156 END DO 157 158 END DO 159 160 ! ! =============== 161 END DO ! End of slab 162 ! ! =============== 163 164 72 165 END SUBROUTINE dyn_zdf_exp_tan 73 166 SUBROUTINE dyn_zdf_exp_adj( kt, p2dt ) -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynzdf_imp_tam.F90
r1885 r2587 126 126 DO ji = fs_2, fs_jpim1 ! vector opt. 127 127 zcoef = - p2dt / fse3u(ji,jj,jk) 128 zwi(ji,jj,jk) = zcoef * avmu(ji,jj,jk ) / fse3uw(ji,jj,jk ) 128 zwi(ji,jj,jk) = zcoef * avmu(ji,jj,jk ) / fse3uw(ji,jj,jk ) * umask(ji,jj,jk) 129 129 zzws = zcoef * avmu(ji,jj,jk+1) / fse3uw(ji,jj,jk+1) 130 130 zws(ji,jj,jk) = zzws * umask(ji,jj,jk+1) -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/SBC/sbc_oce_tam.F90
r1885 r2587 28 28 PUBLIC & 29 29 & sbc_oce_tam_init, & !: Initialize the TAM fields 30 & sbc_oce_tam_deallocate, & !: Deallocate the TAM fields 30 31 !!---------------------------------------------------------------------- 31 32 !! Ocean Surface Boundary Condition fields … … 295 296 296 297 END SUBROUTINE sbc_oce_tam_init 298 SUBROUTINE sbc_oce_tam_deallocate( kindic ) 299 !!----------------------------------------------------------------------- 300 !! 301 !! *** ROUTINE sbc_oce_tam_init *** 302 !! 303 !! ** Purpose : Allocate and initialize the tangent linear and 304 !! adjoint arrays 305 !! 306 !! ** Method : kindic = 0 deallocate both tl and ad variables 307 !! kindic = 1 deallocate only tl variables 308 !! kindic = 2 deallocate only ad variables 309 !! 310 !! ** Action : 311 !! 312 !! References : 313 !! 314 !! History : 315 !! ! 2010-06 (A. Vidard) Initial version 316 !!----------------------------------------------------------------------- 317 !! * Arguments 318 INTEGER, INTENT(IN) :: & 319 & kindic ! indicate which variables to deallocate 320 321 !! * Local declarations 322 323 ! Deallocate tangent linear variable arrays 324 ! --------------------------------------- 325 326 IF ( kindic == 0 .OR. kindic == 1 ) THEN 327 328 IF ( ALLOCATED(utau_tl) ) DEALLOCATE( utau_tl ) 329 IF ( ALLOCATED(vtau_tl) ) DEALLOCATE( vtau_tl ) 330 IF ( ALLOCATED(wndm_tl) ) DEALLOCATE( wndm_tl ) 331 IF ( ALLOCATED(qns_tl) ) DEALLOCATE( qns_tl ) 332 IF ( ALLOCATED(qsr_tl) ) DEALLOCATE( qsr_tl ) 333 IF ( ALLOCATED(emp_tl) ) DEALLOCATE( emp_tl ) 334 IF ( ALLOCATED(emps_tl) ) DEALLOCATE( emps_tl ) 335 IF ( ALLOCATED(fr_i_tl) ) DEALLOCATE( fr_i_tl ) 336 IF ( ALLOCATED(ssu_m_tl) ) DEALLOCATE( ssu_m_tl ) 337 IF ( ALLOCATED(ssv_m_tl) ) DEALLOCATE( ssv_m_tl ) 338 IF ( ALLOCATED(sst_m_tl) ) DEALLOCATE( sst_m_tl ) 339 IF ( ALLOCATED(sss_m_tl) ) DEALLOCATE( sss_m_tl ) 340 341 342 ENDIF 343 344 IF ( kindic == 0 .OR. kindic == 2 ) THEN 345 346 ! Deallocate adjoint variable arrays 347 ! -------------------------------- 348 349 IF ( ALLOCATED(utau_ad) ) DEALLOCATE( utau_ad ) 350 IF ( ALLOCATED(vtau_ad) ) DEALLOCATE( vtau_ad ) 351 IF ( ALLOCATED(wndm_ad) ) DEALLOCATE( wndm_ad ) 352 IF ( ALLOCATED(qns_ad) ) DEALLOCATE( qns_ad ) 353 IF ( ALLOCATED(qsr_ad) ) DEALLOCATE( qsr_ad ) 354 IF ( ALLOCATED(emp_ad) ) DEALLOCATE( emp_ad ) 355 IF ( ALLOCATED(emps_ad) ) DEALLOCATE( emps_ad ) 356 IF ( ALLOCATED(fr_i_ad) ) DEALLOCATE( fr_i_ad ) 357 IF ( ALLOCATED(ssu_m_ad) ) DEALLOCATE( ssu_m_ad ) 358 IF ( ALLOCATED(ssv_m_ad) ) DEALLOCATE( ssv_m_ad ) 359 IF ( ALLOCATED(sst_m_ad) ) DEALLOCATE( sst_m_ad ) 360 IF ( ALLOCATED(sss_m_ad) ) DEALLOCATE( sss_m_ad ) 361 362 ENDIF 363 364 END SUBROUTINE sbc_oce_tam_deallocate 297 365 #endif 298 366 -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/SOL/sol_oce_tam.F90
r1885 r2587 31 31 & nmax_fs 32 32 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 33 USE sol_oce , ONLY: & 34 & nmin 35 #if defined key_dynspg_flt 33 36 USE solver , ONLY: & ! Solver 34 37 & solver_init 35 38 #endif 36 39 !! * Routine accessibility 37 40 … … 41 44 PUBLIC & 42 45 & sol_oce_tam_init, & !: routine called by nemovar.F90 46 & sol_oce_tam_deallocate, & 43 47 ! 44 48 & gcx_tl, & !: Tangent of now solution of the elliptic equation … … 48 52 & gcx_ad, & !: Adjoint of solution of the elliptic equation 49 53 & gcxb_ad, & !: Adjoint of before solution of the elliptic equation 50 & gcb_ad 51 54 & gcb_ad , & !: Adjoint of 2nd member of barotropic linear system 55 & nitsor 52 56 !! * Module variables 53 57 INTEGER, DIMENSION(:), ALLOCATABLE :: & … … 89 93 & kindic ! indicate which variables to allocate/initialize 90 94 95 #if defined key_dynspg_flt 91 96 IF ( kindic == 0 .OR. kindic == 1 ) THEN 92 97 98 IF ( kindic == 0 ) CALL solver_init( nit000 ) 99 93 100 IF ( .NOT. ALLOCATED(nitsor) ) THEN 94 101 95 102 ALLOCATE( nitsor( nitend - nit000 + 1 ) ) 96 97 ENDIF 98 99 nitsor(:) = nmax_fs 100 101 IF ( kindic == 0 ) CALL solver_init( nit000 ) 103 nitsor(:) = nmin 104 105 ENDIF 106 102 107 103 108 ENDIF … … 162 167 163 168 ENDIF 164 169 #endif 165 170 END SUBROUTINE sol_oce_tam_init 166 171 SUBROUTINE sol_oce_tam_deallocate(kindic) 172 !!----------------------------------------------------------------------- 173 !! 174 !! *** ROUTINE sol_oce_tam_deallocate *** 175 !! 176 !! ** Purpose : 177 !! 178 !! ** Method : kindic = 0 deallocate both tl and ad variables 179 !! kindic = 1 deallocate only tl variables 180 !! kindic = 2 deallocate only ad variables 181 !! 182 !! ** Action : 183 !! 184 !! References : 185 !! 186 !! History : 187 !! ! 2010-06 (A. Vidard) Initial version 188 !!----------------------------------------------------------------------- 189 !! * Arguments 190 INTEGER, INTENT(IN) :: & 191 & kindic ! indicate which variables to allocate/initialize 192 #if defined key_dynspg_flt 193 IF ( kindic == 0 ) THEN 194 IF ( ALLOCATED(nitsor) ) DEALLOCATE( nitsor ) 195 END IF 196 197 IF ( kindic == 0 .OR. kindic == 1 ) THEN 198 199 IF ( ALLOCATED(gcx_tl) ) DEALLOCATE( gcx_tl ) 200 201 IF ( ALLOCATED(gcxb_tl) ) DEALLOCATE( gcxb_tl ) 202 203 IF ( ALLOCATED(gcb_tl) ) DEALLOCATE( gcb_tl ) 204 205 IF ( ALLOCATED(gcr_tl) ) DEALLOCATE( gcr_tl ) 206 207 ENDIF 208 209 IF ( kindic == 0 .OR. kindic == 2 ) THEN 210 211 IF ( ALLOCATED(gcx_ad) ) DEALLOCATE( gcx_ad ) 212 213 IF ( ALLOCATED(gcxb_ad) ) DEALLOCATE( gcxb_ad ) 214 215 IF ( ALLOCATED(gcb_ad) ) DEALLOCATE( gcb_ad ) 216 217 ENDIF 218 219 #endif 220 END SUBROUTINE sol_oce_tam_deallocate 167 221 END MODULE sol_oce_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/SOL/solsor_tam.F90
r1885 r2587 19 19 & jpiglo 20 20 USE in_out_manager, ONLY: & ! I/O manager 21 & nit000 21 & nit000, lwp 22 22 USE sol_oce , ONLY: & ! solver variables 23 23 & gcdmat, & … … 71 71 USE tstool_tam , ONLY: & 72 72 & prntst_adj, & 73 & stdgc 73 & stdgc, & 74 & prntst_tlm 74 75 75 76 … … 80 81 PUBLIC sol_sor_adj ! 81 82 PUBLIC sol_sor_tan ! 82 PUBLIC sol_sor_adj_tst ! called by tst.F90 83 83 PUBLIC sol_sor_adj_tst ! called by tamtst.F90 84 #if defined key_tst_tlm 85 PUBLIC sol_sor_tlm_tst ! called by tamtst.F90 86 #endif 84 87 85 88 CONTAINS … … 194 197 195 198 ! test of convergence 196 IF ( jn > nmin .AND. MOD( jn-nmin, nmod ) == 0) THEN199 IF ( (jn > nmin .AND. MOD( jn-nmin, nmod ) == 0) .OR. jn==nmax) THEN 197 200 198 201 SELECT CASE ( nsol_arp ) … … 232 235 ENDIF 233 236 ! indicator of non-convergence or explosion 237 IF( jn == nmax ) nitsor(istp) = jn 234 238 IF( jn == nmax .OR. SQRT(epsr)/eps > 1.e+20 ) kindic = -2 235 239 IF( ncut == 999 ) GOTO 999 … … 318 322 ijmppodd = MOD(nimpp+njmpp+jpr2di+jpr2dj+1,2) 319 323 ijpr2d = MAX(jpr2di,jpr2dj) 320 icount = 0321 324 322 325 ! Fixed number of iterations 323 326 istp = kt - nit000 + 1 324 327 iter = nitsor(istp) 325 328 icount = iter * 2 326 329 ! Output in gcx_ad 327 330 ! ---------------- … … 330 333 331 334 ! ! ============== 332 DO jn = 1, iter! Iterative loop335 DO jn = iter, 1, -1 ! Iterative loop 333 336 ! ! ============== 334 337 ! Guess red update … … 349 352 END DO 350 353 END DO 351 icount = icount + 1 352 354 icount = icount - 1 353 355 ! applied the lateral boundary conditions 354 356 IF( MOD(icount,ijpr2d+1) == 0 ) CALL lbc_lnk_e_adj( gcx_ad, c_solver_pt, 1.0_wp ) ! Lateral BCs … … 375 377 END DO 376 378 377 icount = icount + 1 378 379 icount = icount - 1 379 380 ! applied the lateral boundary conditions 380 381 IF( MOD(icount,ijpr2d+1) == 0 ) CALL lbc_lnk_e_adj( gcx_ad, c_solver_pt, 1.0_wp ) ! Lateral BCs … … 418 419 & jk, & 419 420 & kindic,& ! flags fo solver convergence 421 & kmod, & ! frequency of test for the SOR solver 420 422 & kt ! number of iteration 421 423 INTEGER, DIMENSION(jpi,jpj) :: & … … 465 467 466 468 kt=nit000 469 kindic=0 470 ! kmod = nmod ! store frequency of test for the SOR solver 471 ! nmod = 1 ! force frequency to one (remove adj_tst dependancy to nn_nmin) 467 472 468 469 473 DO jj = 1, jpj 470 474 DO ji = 1, jpi … … 491 495 END DO 492 496 END DO 493 497 ncut = 1 ! reinitilize the solver convergence flag 498 gcr_tl(:,:) = 0.0_wp 494 499 gcb_tl(:,:) = zgcb_tlin(:,:) 495 500 gcx_tl(:,:) = zgcx_tlin(:,:) … … 502 507 !-------------------------------------------------------------------- 503 508 504 DO jk = 1, jpk505 509 DO jj = nldj, nlej 506 510 DO ji = nldi, nlei … … 510 514 END DO 511 515 END DO 512 END DO513 516 !-------------------------------------------------------------------- 514 517 ! Compute the scalar product: ( L dx )^T W dy … … 520 523 ! Call the adjoint routine: dx^* = L^T dy^* 521 524 !-------------------------------------------------------------------- 522 525 gcb_ad(:,:) = 0.0_wp 523 526 gcx_ad(:,:) = zgcx_adin(:,:) 524 527 CALL sol_sor_adj(kt, kindic) … … 533 536 cl_name = 'sol_sor_adj ' 534 537 CALL prntst_adj( cl_name, kumadt, zsp1, zsp2 ) 538 539 ! nmod = kmod ! restore initial frequency of test for the SOR solver 535 540 536 541 DEALLOCATE( & … … 547 552 548 553 END SUBROUTINE sol_sor_adj_tst 554 #if defined key_tst_tlm 555 SUBROUTINE sol_sor_tlm_tst( kumadt ) 556 !!----------------------------------------------------------------------- 557 !! 558 !! *** ROUTINE example_adj_tst *** 559 !! 560 !! ** Purpose : Test the tangent routine. 561 !! 562 !! ** Method : Verify the tangent with Taylor expansion 563 !! 564 !! M(x+hdx) = M(x) + L(hdx) + O(h^2) 565 !! 566 !! where L = tangent routine 567 !! M = direct routine 568 !! dx = input perturbation (random field) 569 !! h = ration on perturbation 570 !! 571 !! In the tangent test we verify that: 572 !! M(x+h*dx) - M(x) 573 !! g(h) = ------------------ ---> 1 as h ---> 0 574 !! L(h*dx) 575 !! and 576 !! g(h) - 1 577 !! f(h) = ---------- ---> k (costant) as h ---> 0 578 !! p 579 !! 580 !! History : 581 !! ! 10-02 (A. Vigilant) 582 !!----------------------------------------------------------------------- 583 #if defined key_tam 584 !! * Modules used 585 USE solsor ! Red-Black Successive Over-Relaxation solver 586 USE tamtrj ! writing out state trajectory 587 USE par_tlm, ONLY: & 588 & tlm_bch, & 589 & cur_loop, & 590 & h_ratio 591 USE istate_mod 592 USE wzvmod ! vertical velocity 593 USE gridrandom, ONLY: & 594 & grid_rd_sd 595 USE trj_tam 596 USE sol_oce , ONLY: & ! ocean dynamics and tracers variables 597 & gcb, gcx, ncut 598 USE oce , ONLY: & ! 599 & ua, ub, un 600 USE opatam_tst_ini, ONLY: & 601 & tlm_namrd 602 USE tamctl, ONLY: & ! Control parameters 603 & numtan, numtan_sc 604 !! * Arguments 605 INTEGER, INTENT(IN) :: & 606 & kumadt ! Output unit 549 607 608 !! * Local declarations 609 INTEGER :: & 610 & ji, & ! dummy loop indices 611 & jj, & 612 & jk, & 613 & kindic,& ! flags fo solver convergence 614 & kt ! number of iteration 615 INTEGER, DIMENSION(jpi,jpj) :: & 616 & iseed_2d ! 2D seed for the random number generator 617 REAL(KIND=wp) :: & 618 & zsp1, zsp2, zsp3, & ! scalar product 619 & zsp_gcb, zsp_gcx, & 620 & zsp, & 621 & gamma, & 622 & zgsp1, & 623 & zgsp2, & 624 & zgsp3, & 625 & zgsp4, & 626 & zgsp5, & 627 & zgsp6, & 628 & zgsp7 629 REAL(KIND=wp), DIMENSION(:,:), ALLOCATABLE :: & 630 & zgcb_tlin , & ! Tangent input 631 & zgcx_tlin , & ! Tangent input 632 & zgcb_out , & ! Direct output 633 & zgcx_out , & ! Direct output 634 & zgcb_wop , & ! Direct output without perturbation 635 & zgcx_wop , & ! Direct output without perturbation 636 & zr ! 3D random field 637 CHARACTER(LEN=14) :: cl_name 638 CHARACTER (LEN=128) :: file_out, file_wop, file_xdx 639 CHARACTER (LEN=90) :: FMT 640 REAL(KIND=wp), DIMENSION(100):: & 641 & zscgcb,zscgcx, & 642 & zscerrgcb, zscerrgcx 643 INTEGER, DIMENSION(100):: & 644 & iiposgcb, ijposgcb, & 645 & iiposgcx, ijposgcx 646 INTEGER:: & 647 & ii, & 648 & isamp=40, & 649 & jsamp=40, & 650 & numsctlm 651 REAL(KIND=wp), DIMENSION(jpi,jpj) :: & 652 & zerrgcb, zerrgcx 653 654 ! Allocate memory 655 656 ALLOCATE( & 657 & zgcb_tlin( jpi,jpj), & 658 & zgcx_tlin( jpi,jpj), & 659 & zgcb_out ( jpi,jpj), & 660 & zgcx_out ( jpi,jpj), & 661 & zgcb_wop ( jpi,jpj), & 662 & zgcx_wop ( jpi,jpj), & 663 & zr( jpi,jpj) & 664 & ) 665 !================================================================== 666 ! 1) dx = ( un_tl, vn_tl, hdivn_tl ) and 667 ! dy = ( hdivb_tl, hdivn_tl ) 668 !================================================================== 669 670 !-------------------------------------------------------------------- 671 ! Reset the tangent and adjoint variables 672 !-------------------------------------------------------------------- 673 zgcb_tlin( :,:) = 0.0_wp 674 zgcx_tlin( :,:) = 0.0_wp 675 zgcb_out ( :,:) = 0.0_wp 676 zgcx_out ( :,:) = 0.0_wp 677 zgcb_wop ( :,:) = 0.0_wp 678 zgcx_wop ( :,:) = 0.0_wp 679 zr( :,:) = 0.0_wp 680 681 !-------------------------------------------------------------------- 682 ! Initialize the tangent input with random noise: dx 683 !-------------------------------------------------------------------- 684 685 !-------------------------------------------------------------------- 686 ! Output filename Xn=F(X0) 687 !-------------------------------------------------------------------- 688 CALL tlm_namrd 689 gamma = h_ratio 690 file_wop='trj_wop_solsor' 691 file_xdx='trj_xdx_solsor' 692 !-------------------------------------------------------------------- 693 ! Initialize the tangent input with random noise: dx 694 !-------------------------------------------------------------------- 695 IF (( cur_loop .NE. 0) .OR. ( gamma .NE. 0.0_wp) )THEN 696 CALL grid_rd_sd( 596035, zr, c_solver_pt, 0.0_wp, stdgc) 697 DO jj = nldj, nlej 698 DO ji = nldi, nlei 699 zgcb_tlin(ji,jj) = zr(ji,jj) 700 END DO 701 END DO 702 CALL grid_rd_sd( 264792, zr, c_solver_pt, 0.0_wp, stdgc) 703 DO jj = nldj, nlej 704 DO ji = nldi, nlei 705 zgcx_tlin(ji,jj) = zr(ji,jj) 706 END DO 707 END DO 708 ENDIF 709 710 !-------------------------------------------------------------------- 711 ! Complete Init for Direct 712 !------------------------------------------------------------------- 713 CALL istate_p 714 715 ! *** initialize the reference trajectory 716 ! ------------ 717 718 ! gcx (:,:) = ( ua(:,:,1) + ub(:,:,1) ) / 10.0_wp 719 ! gcb (:,:) = ( ua(:,:,3) + ub(:,:,3) ) / 10.0_wp 720 CALL trj_rea( nit000-1, 1 ) 721 CALL trj_rea( nit000, 1 ) 722 gcx (:,:) = un(:,:,1) / 10.0_wp 723 gcb (:,:) = un(:,:,3) / 10.0_wp 724 725 IF (( cur_loop .NE. 0) .OR. ( gamma .NE. 0.0_wp) )THEN 726 zgcb_tlin(:,:) = gamma * zgcb_tlin(:,:) 727 gcb(:,:) = gcb(:,:) + zgcb_tlin(:,:) 728 729 zgcx_tlin(:,:) = gamma * zgcx_tlin(:,:) 730 gcx(:,:) = gcx(:,:) + zgcx_tlin(:,:) 731 ENDIF 732 733 !-------------------------------------------------------------------- 734 ! Compute the direct model F(X0,t=n) = Xn 735 !-------------------------------------------------------------------- 736 kindic=0 737 ncut=1 738 IF ( tlm_bch /= 2 ) CALL sol_sor(kindic) 739 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 740 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 741 !-------------------------------------------------------------------- 742 ! Compute the Tangent 743 !-------------------------------------------------------------------- 744 IF ( tlm_bch == 2 ) THEN 745 !-------------------------------------------------------------------- 746 ! Initialize the tangent variables: dy^* = W dy 747 !-------------------------------------------------------------------- 748 gcr_tl(:,:) = 0.0_wp 749 gcb_tl (:,:) = zgcb_tlin (:,:) 750 gcx_tl (:,:) = zgcx_tlin (:,:) 751 752 !----------------------------------------------------------------------- 753 ! Initialization of the dynamics and tracer fields for the tangent 754 !----------------------------------------------------------------------- 755 ncut=1 !reset indicator of solver convergence 756 CALL sol_sor_tan(nit000, kindic) 757 !-------------------------------------------------------------------- 758 ! Compute the scalar product: ( L(t0,tn) gamma dx0 ) ) 759 !-------------------------------------------------------------------- 760 761 zsp_gcx = DOT_PRODUCT( gcx_tl, gcx_tl ) 762 zsp2 = zsp_gcx 763 !-------------------------------------------------------------------- 764 ! Storing data 765 !-------------------------------------------------------------------- 766 CALL trj_rd_spl(file_wop) 767 zgcx_wop (:,:) = gcx (:,:) 768 CALL trj_rd_spl(file_xdx) 769 zgcx_out (:,:) = gcx (:,:) 770 !-------------------------------------------------------------------- 771 ! Compute the Linearization Error 772 ! Nn = M( X0+gamma.dX0, t0,tn) - M(X0, t0,tn) 773 ! and 774 ! Compute the Linearization Error 775 ! En = Nn -TL(gamma.dX0, t0,tn) 776 !-------------------------------------------------------------------- 777 ! Warning: Here we re-use local variables z()_out and z()_wop 778 ii=0 779 DO jj = 1, jpj 780 DO ji = 1, jpi 781 zgcx_out (ji,jj) = zgcx_out (ji,jj) - zgcx_wop (ji,jj) 782 zgcx_wop (ji,jj) = zgcx_out (ji,jj) - gcx_tl (ji,jj) 783 IF ( gcx_tl(ji,jj) .NE. 0.0_wp ) zerrgcx(ji,jj) = zgcx_out(ji,jj)/gcx_tl(ji,jj) 784 IF( (MOD(ji, isamp) .EQ. 0) .AND. & 785 & (MOD(jj, jsamp) .EQ. 0) ) THEN 786 ii = ii+1 787 iiposgcx(ii) = ji 788 ijposgcx(ii) = jj 789 IF ( INT(tmask(ji,jj,1)) .NE. 0) THEN 790 zscgcx (ii) = zgcx_wop(ji,jj) 791 zscerrgcx (ii) = ( zerrgcx(ji,jj) - 1.0_wp ) / gamma 792 ENDIF 793 ENDIF 794 END DO 795 END DO 796 797 zsp_gcx = DOT_PRODUCT( zgcx_out, zgcx_out ) 798 799 zsp1 = zsp_gcx 800 801 zsp_gcx = DOT_PRODUCT( zgcx_wop, zgcx_wop ) 802 803 zsp3 = zsp_gcx 804 !-------------------------------------------------------------------- 805 ! Print the linearization error En - norme 2 806 !-------------------------------------------------------------------- 807 ! 14 char:'12345678901234' 808 cl_name = 'sol_sor: En ' 809 zsp = SQRT(zsp3) 810 zgsp5 = zsp 811 CALL prntst_tlm( cl_name, kumadt, zsp, h_ratio ) 812 813 !-------------------------------------------------------------------- 814 ! Compute TLM norm2 815 !-------------------------------------------------------------------- 816 zsp = SQRT(zsp2) 817 818 zgsp4 = zsp 819 cl_name = 'sol_sor: Ln2 ' 820 CALL prntst_tlm( cl_name, kumadt, zsp, h_ratio ) 821 822 !-------------------------------------------------------------------- 823 ! Print the linearization error Nn - norme 2 824 !-------------------------------------------------------------------- 825 zsp = SQRT(zsp1) 826 827 cl_name = 'solsor:Mhdx-Mx' 828 CALL prntst_tlm( cl_name, kumadt, zsp, h_ratio ) 829 830 zgsp3 = SQRT( zsp3/zsp2 ) 831 zgsp7 = zgsp3/gamma 832 zgsp1 = zsp 833 zgsp2 = zgsp1 / zgsp4 834 zgsp6 = (zgsp2 - 1.0_wp)/gamma 835 836 FMT = "(A8,2X,I4.4,2X,E6.1,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13)" 837 WRITE(numtan,FMT) 'solsor ', cur_loop, h_ratio, zgsp1, zgsp2, zgsp3, zgsp4, zgsp5, zgsp6, zgsp7 838 !-------------------------------------------------------------------- 839 ! Unitary calculus 840 !-------------------------------------------------------------------- 841 FMT = "(A8,2X,A8,2X,I4.4,2X,E6.1,2X,I4.4,2X,I4.4,2X,I4.4,2X,E20.13,1X)" 842 cl_name ='sol_sor ' 843 IF(lwp) THEN 844 DO ii=1, 100, 1 845 IF ( zscgcx(ii) .NE. 0.0_wp ) WRITE(numtan_sc,FMT) cl_name, 'zscgcx ', & 846 & cur_loop, h_ratio, ii, iiposgcx(ii), ijposgcx(ii), zscgcx(ii) 847 ENDDO 848 DO ii=1, 100, 1 849 IF ( zscerrgcx(ii) .NE. 0.0_wp ) WRITE(numtan_sc,FMT) cl_name, 'zscerrgcx ', & 850 & cur_loop, h_ratio, ii, iiposgcx(ii), ijposgcx(ii), zscerrgcx(ii) 851 ENDDO 852 ! write separator 853 WRITE(numtan_sc,"(A4)") '====' 854 ENDIF 855 856 ENDIF 857 858 DEALLOCATE( & 859 & zgcb_tlin, & 860 & zgcx_tlin, & 861 & zgcb_out , & 862 & zgcx_out , & 863 & zgcb_wop , & 864 & zgcx_wop , & 865 & zr & 866 & ) 867 #else 868 !! * Arguments 869 INTEGER, INTENT(IN) :: & 870 & kumadt ! Output unit 871 ! dummy routine 872 #endif 873 END SUBROUTINE sol_sor_tlm_tst 874 #endif 550 875 END MODULE solsor_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TAM/trj_tam.F90
r2586 r2587 32 32 USE wzvmod ! vertical velocity 33 33 34 USE oce_tam, ONLY : & ! Dynamics and active tracers defined in memory 35 & un_tl, vn_tl, tn_tl, & 36 & wn_tl, hdivn_tl, rotn_tl, & 37 #if defined key_dynspg_flt 38 & sshn_tl, & 39 #endif 40 & sn_tl 41 34 42 IMPLICIT NONE 35 43 … … 39 47 & trj_rea, & !: Read trajectory at time step kstep into now fields 40 48 & trj_rd_spl, & !: Read simple data (without interpolation) 41 & trj_wri_spl !: Write simple data (without interpolation) 49 & trj_wri_spl, & !: Write simple data (without interpolation) 50 & tl_trj_wri, & !: Write simple linear-tangent data 51 & tl_trj_ini, & !: initialize the model-tangent state trajectory 52 & trj_deallocate !: Deallocate all the saved variable 53 54 LOGICAL, PUBLIC :: & 55 & ln_trjwri_tan = .FALSE. !: No output of the state trajectory fields 56 57 CHARACTER (LEN=40), PUBLIC, PARAMETER :: & 58 & c_tantrj = 'tl_trajectory' !: Filename for storing the 59 !: linear-tangent trajectory 60 INTEGER, PUBLIC :: & 61 & nittrjfrq_tan !: Frequency of trajectory output for linear-tangent 42 62 43 63 !! * Module variables 64 LOGICAL, SAVE :: & 65 & ln_mem = .FALSE. !: Flag for allocation 44 66 INTEGER, SAVE :: inumtrj1 = -1, inumtrj2 = -1 45 67 REAL(wp), SAVE :: & … … 107 129 CONTAINS 108 130 131 SUBROUTINE tl_trj_ini 132 !!----------------------------------------------------------------------- 133 !! 134 !! *** ROUTINE tl_trj_ini *** 135 !! 136 !! ** Purpose : initialize the model-tangent state trajectory 137 !! 138 !! ** Method : 139 !! 140 !! ** Action : 141 !! 142 !! References : 143 !! 144 !! History : 145 !! ! 10-07 (F. Vigilant) 146 !!----------------------------------------------------------------------- 147 148 IMPLICIT NONE 149 150 !! * Modules used 151 NAMELIST/namtl_trj/ nittrjfrq_tan, ln_trjwri_tan 152 153 ln_trjwri_tan = .FALSE. 154 nittrjfrq_tan = 1 155 156 REWIND ( numnam ) 157 READ ( numnam, namtl_trj ) 158 159 ! Control print 160 IF(lwp) THEN 161 WRITE(numout,*) 162 WRITE(numout,*) 'tl_trj_ini : Linear-Tagent Trajectory handling:' 163 WRITE(numout,*) '~~~~~~~~~~~~' 164 WRITE(numout,*) ' Namelist namtl_trj : set trajectory parameters' 165 WRITE(numout,*) ' Logical switch for writing out state trajectory ', & 166 & ' ln_trjwri_tan = ', ln_trjwri_tan 167 WRITE(numout,*) ' Frequency of trajectory output ', & 168 & ' nittrjfrq_tan = ', nittrjfrq_tan 169 END IF 170 END SUBROUTINE tl_trj_ini 171 109 172 SUBROUTINE trj_rea( kstp, kdir ) 110 173 !!----------------------------------------------------------------------- … … 242 305 & ) 243 306 #endif 307 ln_mem = .TRUE. 244 308 245 309 ENDIF … … 310 374 311 375 ENDIF 312 ! added 376 313 377 IF ( ( kstp - nit000 + 1 /= 0 ) .AND. ( kdir == -1 ) ) THEN 314 378 ! We update the input filename … … 321 385 ENDIF 322 386 ENDIF 323 ! end added 387 324 388 ! Read record 1 325 389 … … 328 392 329 393 IF ( kdir == -1 ) inrcm = inrcm - 1 330 !added331 394 ! inrc = inrcm 332 395 ! temporary fix: currently, only one field by step time 333 396 inrc = 1 334 397 stpr1 = (inrcm - 1) * nittrjfrq 335 ! stpr1 = (inrc - 1) * nittrjfrq336 !end added337 398 338 399 ! bug fixed to read several time the initial data … … 351 412 IF ( inumtrj1 /= -1 ) CALL iom_open( cl_asmtrj, inumtrj1 ) 352 413 353 CALL iom_get( inumtrj1, jpdom_ data, 'emp' , empr1 , inrc )354 CALL iom_get( inumtrj1, jpdom_ data, 'emps' , empsr1 , inrc )355 CALL iom_get( inumtrj1, jpdom_ data, 'un' , unr1 , inrc )356 CALL iom_get( inumtrj1, jpdom_ data, 'vn' , vnr1 , inrc )357 CALL iom_get( inumtrj1, jpdom_ data, 'tn' , tnr1 , inrc )358 CALL iom_get( inumtrj1, jpdom_ data, 'sn' , snr1 , inrc )359 CALL iom_get( inumtrj1, jpdom_ data, 'avmu' , avmur1 , inrc )360 CALL iom_get( inumtrj1, jpdom_ data, 'avmv' , avmvr1 , inrc )361 CALL iom_get( inumtrj1, jpdom_ data, 'avt' , avtr1 , inrc )414 CALL iom_get( inumtrj1, jpdom_autoglo, 'emp' , empr1 , inrc ) 415 CALL iom_get( inumtrj1, jpdom_autoglo, 'emps' , empsr1 , inrc ) 416 CALL iom_get( inumtrj1, jpdom_autoglo, 'un' , unr1 , inrc ) 417 CALL iom_get( inumtrj1, jpdom_autoglo, 'vn' , vnr1 , inrc ) 418 CALL iom_get( inumtrj1, jpdom_autoglo, 'tn' , tnr1 , inrc ) 419 CALL iom_get( inumtrj1, jpdom_autoglo, 'sn' , snr1 , inrc ) 420 CALL iom_get( inumtrj1, jpdom_autoglo, 'avmu' , avmur1 , inrc ) 421 CALL iom_get( inumtrj1, jpdom_autoglo, 'avmv' , avmvr1 , inrc ) 422 CALL iom_get( inumtrj1, jpdom_autoglo, 'avt' , avtr1 , inrc ) 362 423 #if defined key_ldfslp 363 CALL iom_get( inumtrj1, jpdom_ data, 'uslp' , uslpr1 , inrc )364 CALL iom_get( inumtrj1, jpdom_ data, 'vslp' , vslpr1 , inrc )365 CALL iom_get( inumtrj1, jpdom_ data, 'wslpi' , wslpir1 , inrc )366 CALL iom_get( inumtrj1, jpdom_ data, 'wslpj' , wslpjr1 , inrc )424 CALL iom_get( inumtrj1, jpdom_autoglo, 'uslp' , uslpr1 , inrc ) 425 CALL iom_get( inumtrj1, jpdom_autoglo, 'vslp' , vslpr1 , inrc ) 426 CALL iom_get( inumtrj1, jpdom_autoglo, 'wslpi' , wslpir1 , inrc ) 427 CALL iom_get( inumtrj1, jpdom_autoglo, 'wslpj' , wslpjr1 , inrc ) 367 428 #endif 368 429 #if defined key_zdfddm 369 CALL iom_get( inumtrj1, jpdom_ data, 'avs' , avsr1 , inrc )370 #endif 371 CALL iom_get( inumtrj1, jpdom_ data, 'ta' , tar1 , inrc )372 CALL iom_get( inumtrj1, jpdom_ data, 'sa' , sar1 , inrc )373 CALL iom_get( inumtrj1, jpdom_ data, 'tb' , tbr1 , inrc )374 CALL iom_get( inumtrj1, jpdom_ data, 'sb' , sbr1 , inrc )430 CALL iom_get( inumtrj1, jpdom_autoglo, 'avs' , avsr1 , inrc ) 431 #endif 432 CALL iom_get( inumtrj1, jpdom_autoglo, 'ta' , tar1 , inrc ) 433 CALL iom_get( inumtrj1, jpdom_autoglo, 'sa' , sar1 , inrc ) 434 CALL iom_get( inumtrj1, jpdom_autoglo, 'tb' , tbr1 , inrc ) 435 CALL iom_get( inumtrj1, jpdom_autoglo, 'sb' , sbr1 , inrc ) 375 436 #if defined key_tradmp 376 CALL iom_get( inumtrj1, jpdom_ data, 'hmlp' , hmlp1 , inrc )437 CALL iom_get( inumtrj1, jpdom_autoglo, 'hmlp' , hmlp1 , inrc ) 377 438 #endif 378 439 #if defined key_traldf_eiv 379 CALL iom_get( inumtrj1, jpdom_ data, 'aeiu' , aeiur1 , inrc )380 CALL iom_get( inumtrj1, jpdom_ data, 'aeiv' , aeivr1 , inrc )381 CALL iom_get( inumtrj1, jpdom_ data, 'aeiw' , aeiwr1 , inrc )440 CALL iom_get( inumtrj1, jpdom_autoglo, 'aeiu' , aeiur1 , inrc ) 441 CALL iom_get( inumtrj1, jpdom_autoglo, 'aeiv' , aeivr1 , inrc ) 442 CALL iom_get( inumtrj1, jpdom_autoglo, 'aeiw' , aeiwr1 , inrc ) 382 443 #endif 383 444 CALL iom_close( inumtrj1 ) … … 450 511 ! Read record 2 451 512 452 !! IF ( ( kstp /= nitend ) .AND. ( kdir == 1 ) .OR. &453 !! & ( kstp == nitend ) .AND. ( kdir == -1 ) ) THEN454 ! change455 513 IF ( ( ( kstp /= nitend ) .AND. ( kdir == 1 )) .OR. & 456 514 & ( kstp == nitend ) .AND.( kdir == -1 ) ) THEN 457 ! end change 458 !added 459 ! ! Need to open next saved file when kstp = initial step 460 ! IF ( kstp - nit000 + 1 == 0 ) THEN 461 ! Need to open next saved file when kstp = initial step 462 ! change 463 ! IF ( ( kstp /= nitend ) .AND. ( kdir == 1 ) ) THEN 464 ! end change 465 ! end added 515 466 516 ! Define the input file 467 517 IF ( kdir == -1 ) THEN … … 479 529 480 530 CALL iom_open( cl_asmtrj, inumtrj2 ) 481 ! change 482 ! END IF 483 !end change 531 484 532 485 533 inrcp = inrcm + 1 486 534 ! inrc = inrcp 487 !added488 535 inrc = 1 ! temporary fix 489 !end added 536 490 537 stpr2 = (inrcp - 1) * nittrjfrq 491 CALL iom_get( inumtrj2, jpdom_ data, 'emp' , empr2 , inrc )492 CALL iom_get( inumtrj2, jpdom_ data, 'emps' , empsr2 , inrc )493 CALL iom_get( inumtrj2, jpdom_ data, 'un' , unr2 , inrc )494 CALL iom_get( inumtrj2, jpdom_ data, 'vn' , vnr2 , inrc )495 CALL iom_get( inumtrj2, jpdom_ data, 'tn' , tnr2 , inrc )496 CALL iom_get( inumtrj2, jpdom_ data, 'sn' , snr2 , inrc )497 CALL iom_get( inumtrj2, jpdom_ data, 'avmu' , avmur2 , inrc )498 CALL iom_get( inumtrj2, jpdom_ data, 'avmv' , avmvr2 , inrc )499 CALL iom_get( inumtrj2, jpdom_ data, 'avt' , avtr2 , inrc )538 CALL iom_get( inumtrj2, jpdom_autoglo, 'emp' , empr2 , inrc ) 539 CALL iom_get( inumtrj2, jpdom_autoglo, 'emps' , empsr2 , inrc ) 540 CALL iom_get( inumtrj2, jpdom_autoglo, 'un' , unr2 , inrc ) 541 CALL iom_get( inumtrj2, jpdom_autoglo, 'vn' , vnr2 , inrc ) 542 CALL iom_get( inumtrj2, jpdom_autoglo, 'tn' , tnr2 , inrc ) 543 CALL iom_get( inumtrj2, jpdom_autoglo, 'sn' , snr2 , inrc ) 544 CALL iom_get( inumtrj2, jpdom_autoglo, 'avmu' , avmur2 , inrc ) 545 CALL iom_get( inumtrj2, jpdom_autoglo, 'avmv' , avmvr2 , inrc ) 546 CALL iom_get( inumtrj2, jpdom_autoglo, 'avt' , avtr2 , inrc ) 500 547 #if defined key_ldfslp 501 CALL iom_get( inumtrj2, jpdom_ data, 'uslp' , uslpr2 , inrc )502 CALL iom_get( inumtrj2, jpdom_ data, 'vslp' , vslpr2 , inrc )503 CALL iom_get( inumtrj2, jpdom_ data, 'wslpi' , wslpir2 , inrc )504 CALL iom_get( inumtrj2, jpdom_ data, 'wslpj' , wslpjr2 , inrc )548 CALL iom_get( inumtrj2, jpdom_autoglo, 'uslp' , uslpr2 , inrc ) 549 CALL iom_get( inumtrj2, jpdom_autoglo, 'vslp' , vslpr2 , inrc ) 550 CALL iom_get( inumtrj2, jpdom_autoglo, 'wslpi' , wslpir2 , inrc ) 551 CALL iom_get( inumtrj2, jpdom_autoglo, 'wslpj' , wslpjr2 , inrc ) 505 552 #endif 506 553 #if defined key_zdfddm 507 CALL iom_get( inumtrj2, jpdom_ data, 'avs' , avsr2 , inrc )508 #endif 509 CALL iom_get( inumtrj2, jpdom_ data, 'ta' , tar2 , inrc )510 CALL iom_get( inumtrj2, jpdom_ data, 'sa' , sar2 , inrc )511 CALL iom_get( inumtrj2, jpdom_ data, 'tb' , tbr2 , inrc )512 CALL iom_get( inumtrj2, jpdom_ data, 'sb' , sbr2 , inrc )554 CALL iom_get( inumtrj2, jpdom_autoglo, 'avs' , avsr2 , inrc ) 555 #endif 556 CALL iom_get( inumtrj2, jpdom_autoglo, 'ta' , tar2 , inrc ) 557 CALL iom_get( inumtrj2, jpdom_autoglo, 'sa' , sar2 , inrc ) 558 CALL iom_get( inumtrj2, jpdom_autoglo, 'tb' , tbr2 , inrc ) 559 CALL iom_get( inumtrj2, jpdom_autoglo, 'sb' , sbr2 , inrc ) 513 560 #if defined key_tradmp 514 CALL iom_get( inumtrj2, jpdom_ data, 'hmlp' , hmlp2 , inrc )561 CALL iom_get( inumtrj2, jpdom_autoglo, 'hmlp' , hmlp2 , inrc ) 515 562 #endif 516 563 #if defined key_traldf_eiv 517 CALL iom_get( inumtrj2, jpdom_ data, 'aeiu' , aeiur2 , inrc )518 CALL iom_get( inumtrj2, jpdom_ data, 'aeiv' , aeivr2 , inrc )519 CALL iom_get( inumtrj2, jpdom_ data, 'aeiw' , aeiwr2 , inrc )564 CALL iom_get( inumtrj2, jpdom_autoglo, 'aeiu' , aeiur2 , inrc ) 565 CALL iom_get( inumtrj2, jpdom_autoglo, 'aeiv' , aeivr2 , inrc ) 566 CALL iom_get( inumtrj2, jpdom_autoglo, 'aeiw' , aeiwr2 , inrc ) 520 567 #endif 521 568 CALL iom_close( inumtrj2 ) … … 526 573 ENDIF 527 574 575 ENDIF 576 577 ! Add warning for user 578 IF ( (kstp == nitend) .AND. ( MOD( kstp - nit000 + 1, nittrjfrq ) /= 0 ) ) THEN 579 IF(lwp) WRITE(numout,*) ' Warning ! nitend (=',nitend, ')', & 580 & ' and saving frequency (=',nittrjfrq,') not compatible.' 528 581 ENDIF 529 582 … … 611 664 !! *Module udes 612 665 USE iom 666 USE sol_oce, ONLY : & ! solver variables 667 & gcb, gcx 613 668 !! * Arguments 614 669 !! * Local declarations … … 647 702 CALL iom_rstput( fd, fd, inum, 'grv' , grv ) 648 703 CALL iom_rstput( fd, fd, inum, 'rn2' , rn2 ) 704 CALL iom_rstput( fd, fd, inum, 'gcb' , gcb ) 705 CALL iom_rstput( fd, fd, inum, 'gcx' , gcx ) 649 706 650 707 CALL iom_close( inum ) … … 668 725 !! *Module udes 669 726 USE iom ! I/O module 727 USE sol_oce, ONLY : & ! solver variables 728 & gcb, gcx 670 729 !! * Arguments 671 730 !! * Local declarations … … 704 763 CALL iom_get( inum, jpdom_autoglo, 'grv' , grv, fd ) 705 764 CALL iom_get( inum, jpdom_autoglo, 'rn2' , rn2, fd ) 765 CALL iom_get( inum, jpdom_autoglo, 'gcb' , gcb, fd ) 766 CALL iom_get( inum, jpdom_autoglo, 'gcx' , gcx, fd ) 706 767 707 768 CALL iom_close( inum ) … … 709 770 END SUBROUTINE trj_rd_spl 710 771 772 SUBROUTINE tl_trj_wri(kstp) 773 !!----------------------------------------------------------------------- 774 !! 775 !! *** ROUTINE tl_trj_wri *** 776 !! 777 !! ** Purpose : Write SimPLe data to file the model state trajectory 778 !! 779 !! ** Method : 780 !! 781 !! ** Action : 782 !! 783 !! History : 784 !! ! 10-07 (F. Vigilant) 785 !!----------------------------------------------------------------------- 786 !! *Module udes 787 USE iom 788 !! * Arguments 789 INTEGER, INTENT(in) :: & 790 & kstp ! Step for requested trajectory 791 !! * Local declarations 792 INTEGER :: & 793 & inum ! File unit number 794 INTEGER :: & 795 & it 796 CHARACTER (LEN=50) :: & 797 & filename 798 CHARACTER (LEN=100) :: & 799 & cl_tantrj 800 801 ! Initialize data and open file 802 !! if step time is corresponding to a saved state 803 IF ( ( MOD( kstp - nit000 + 1, nittrjfrq_tan ) == 0 ) ) THEN 804 805 it = kstp - nit000 + 1 806 807 ! Define the input file 808 WRITE(cl_tantrj, FMT='(A,A,I5.5,".nc")' ) TRIM( c_tantrj ), '_', it 809 cl_tantrj = TRIM( cl_tantrj ) 810 811 IF(lwp) THEN 812 WRITE(numout,*) 813 WRITE(numout,*)'Writing linear-tangent fields from : ',TRIM(cl_tantrj) 814 WRITE(numout,*) 815 ENDIF 816 817 CALL iom_open( cl_tantrj, inum, ldwrt = .TRUE., kiolib = jprstlib) 818 819 ! Output trajectory fields 820 CALL iom_rstput( it, it, inum, 'un_tl' , un_tl ) 821 CALL iom_rstput( it, it, inum, 'vn_tl' , vn_tl ) 822 CALL iom_rstput( it, it, inum, 'tn_tl' , tn_tl ) 823 CALL iom_rstput( it, it, inum, 'sn_tl' , sn_tl ) 824 CALL iom_rstput( it, it, inum, 'wn_tl' , wn_tl ) 825 CALL iom_rstput( it, it, inum, 'hdivn_tl', hdivn_tl) 826 CALL iom_rstput( it, it, inum, 'rotn_tl' , rotn_tl ) 827 #if defined key_dynspg_flt 828 CALL iom_rstput( it, it, inum, 'sshn_tl' , sshn_tl ) 829 #endif 830 CALL iom_close( inum ) 831 832 ENDIF 833 834 END SUBROUTINE tl_trj_wri 835 836 837 SUBROUTINE trj_deallocate 838 !!----------------------------------------------------------------------- 839 !! 840 !! *** ROUTINE trj_deallocate *** 841 !! 842 !! ** Purpose : Deallocate saved trajectory arrays 843 !! 844 !! ** Method : 845 !! 846 !! ** Action : 847 !! 848 !! History : 849 !! ! 2010-06 (A. Vidard) 850 !!----------------------------------------------------------------------- 851 852 IF ( ln_mem ) THEN 853 DEALLOCATE( & 854 & empr1, & 855 & empsr1, & 856 & empr2, & 857 & empsr2 & 858 & ) 859 860 DEALLOCATE( & 861 & unr1, & 862 & vnr1, & 863 & tnr1, & 864 & snr1, & 865 & avmur1, & 866 & avmvr1, & 867 & avtr1, & 868 & tar1, & 869 & sar1, & 870 & tbr1, & 871 & sbr1, & 872 & unr2, & 873 & vnr2, & 874 & tnr2, & 875 & snr2, & 876 & avmur2, & 877 & avmvr2, & 878 & avtr2, & 879 & tar2, & 880 & sar2, & 881 & tbr2, & 882 & sbr2 & 883 & ) 884 885 #if defined key_traldf_eiv 886 #if defined key_traldf_c3d 887 #elif defined key_traldf_c2d 888 DEALLOCATE( & 889 & aeiur1, & 890 & aeivr1, & 891 & aeiwr1, & 892 & aeiur2, & 893 & aeivr2, & 894 & aeiwr2 & 895 & ) 896 #elif defined key_traldf_c1d 897 #endif 898 #endif 899 900 #if defined key_ldfslp 901 DEALLOCATE( & 902 & uslpr1, & 903 & vslpr1, & 904 & wslpir1, & 905 & wslpjr1, & 906 & uslpr2, & 907 & vslpr2, & 908 & wslpir2, & 909 & wslpjr2 & 910 & ) 911 #endif 912 913 #if defined key_zdfddm 914 DEALLOCATE( & 915 & avsr1, & 916 & avsr2 & 917 & ) 918 #endif 919 920 #if defined key_tradmp 921 DEALLOCATE( & 922 & hmlp1, & 923 & hmlp2 & 924 & ) 925 #endif 926 ENDIF 927 END SUBROUTINE trj_deallocate 711 928 #endif 712 929 END MODULE trj_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TRA/traadv_cen2_tam.F90
r1885 r2587 127 127 PUBLIC tra_adv_cen2_adj ! routine called by traadv_tam.F90 128 128 PUBLIC tra_adv_cen2_adj_tst! routine called by tst.F90 129 #if defined key_tst_tlm 129 130 PUBLIC tra_adv_cen2_tlm_tst! routine called by tamtst.F90 131 #endif 130 132 131 133 REAL(wp), DIMENSION(jpi,jpj) :: & … … 935 937 936 938 END SUBROUTINE tra_adv_cen2_adj_tst 937 939 #if defined key_tst_tlm 938 940 SUBROUTINE tra_adv_cen2_tlm_tst( kumadt ) 939 941 !!----------------------------------------------------------------------- … … 968 970 USE tamtrj ! writing out state trajectory 969 971 USE par_tlm, ONLY: & 972 & tlm_bch, & 970 973 & cur_loop, & 971 974 & h_ratio … … 1027 1030 & z3r 1028 1031 CHARACTER(LEN=14) :: cl_name 1029 CHARACTER (LEN=128) :: file_out, file_wop 1032 CHARACTER (LEN=128) :: file_out, file_wop, file_xdx 1030 1033 CHARACTER (LEN=90) :: FMT 1031 1034 REAL(KIND=wp), DIMENSION(100):: & … … 1084 1087 ! Output filename Xn=F(X0) 1085 1088 !-------------------------------------------------------------------- 1086 file_wop='trj_wop_tradv_cen2'1087 1089 CALL tlm_namrd 1088 1090 gamma = h_ratio 1091 file_wop='trj_wop_tradv_cen2' 1092 file_xdx='trj_xdx_tradv_cen2' 1089 1093 !-------------------------------------------------------------------- 1090 1094 ! Initialize the tangent input with random noise: dx … … 1151 1155 ! Complete Init for Direct 1152 1156 !------------------------------------------------------------------- 1153 CALL istate_p1157 IF ( tlm_bch /= 2 ) CALL istate_p 1154 1158 1155 1159 ! *** initialize the reference trajectory … … 1184 1188 ! Compute the direct model F(X0,t=n) = Xn 1185 1189 !-------------------------------------------------------------------- 1186 CALL tra_adv_cen2(nit000, un, vn, wn) 1187 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 1190 IF ( tlm_bch /= 2 ) CALL tra_adv_cen2(nit000, un, vn, wn) 1191 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 1192 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 1188 1193 !-------------------------------------------------------------------- 1189 1194 ! Compute the Tangent 1190 1195 !-------------------------------------------------------------------- 1191 IF ( cur_loop .NE. 0) THEN 1192 !-------------------------------------------------------------------- 1193 ! Storing data 1194 !-------------------------------------------------------------------- 1195 zta_out (:,:,:) = ta (:,:,:) 1196 zsa_out (:,:,:) = sa (:,:,:) 1197 1196 IF ( tlm_bch == 2 ) THEN 1198 1197 !-------------------------------------------------------------------- 1199 1198 ! Initialize the tangent variables: dy^* = W dy … … 1214 1213 ! Compute the scalar product: ( L(t0,tn) gamma dx0 ) ) 1215 1214 !-------------------------------------------------------------------- 1216 1217 1215 zsp2_Ta = DOT_PRODUCT( ta_tl, ta_tl ) 1218 1216 zsp2_Sa = DOT_PRODUCT( sa_tl, sa_tl ) 1219 1217 1220 1218 zsp2 = zsp2_Ta + zsp2_Sa 1221 1222 1219 !-------------------------------------------------------------------- 1223 1220 ! Storing data 1224 1221 !-------------------------------------------------------------------- 1225 1222 CALL trj_rd_spl(file_wop) 1226 1227 1223 zta_wop (:,:,:) = ta (:,:,:) 1228 1224 zsa_wop (:,:,:) = sa (:,:,:) 1229 1225 CALL trj_rd_spl(file_xdx) 1226 zta_out (:,:,:) = ta (:,:,:) 1227 zsa_out (:,:,:) = sa (:,:,:) 1230 1228 !-------------------------------------------------------------------- 1231 1229 ! Compute the Linearization Error … … 1372 1370 END SUBROUTINE tra_adv_cen2_tlm_tst 1373 1371 #endif 1374 1372 #endif 1375 1373 !!====================================================================== 1376 1374 END MODULE traadv_cen2_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TRA/traadv_eiv_tam.F90
r1885 r2587 23 23 & wp 24 24 USE par_oce , ONLY: & ! Ocean space and time domain variables 25 & jpi, &26 & jpj, &27 & jpk25 & jpi, jpj, jpk 26 USE in_out_manager, ONLY: & ! I/O manager 27 & lwp, numout 28 28 29 29 IMPLICIT NONE -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TRA/traadv_tam.F90
r1885 r2587 43 43 & tra_adv_cen2_tan, & 44 44 & tra_adv_cen2_adj, & 45 & tra_adv_cen2_adj_tst, & 46 & tra_adv_cen2_tlm_tst 45 #if defined key_tst_tlm 46 & tra_adv_cen2_tlm_tst, & 47 #endif 48 & tra_adv_cen2_adj_tst 47 49 USE traadv_eiv_tam, ONLY: & ! advection trend - eddy induced velocity (tra_adv_eiv routine) 48 50 & tra_adv_eiv_tan, & 49 51 & tra_adv_eiv_adj 50 ! USE in_out_manager, ONLY : & ! I/O manager51 ! & lwp, &52 ! & numout, &53 ! & nit00054 52 USE in_out_manager ! I/O manager 55 53 USE prtctl ! Print control … … 62 60 PUBLIC tra_adv_ctl_tam ! routine called by stepadj module 63 61 PUBLIC tra_adv_adj_tst ! routine called by tst module 62 #if defined key_tst_tlm 64 63 PUBLIC tra_adv_tlm_tst ! routine called by tst module 64 #endif 65 65 !!* Namelist nam_traadv 66 66 LOGICAL, PUBLIC :: ln_traadv_cen2 = .TRUE. ! 2nd order centered scheme flag … … 305 305 ! 306 306 END SUBROUTINE tra_adv_ctl_tam 307 307 #if defined key_tst_tlm 308 308 SUBROUTINE tra_adv_tlm_tst( kumadt ) 309 309 !!----------------------------------------------------------------------- … … 335 335 END SUBROUTINE tra_adv_tlm_tst 336 336 #endif 337 #endif 337 338 338 339 -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TRA/traldf_lap_tam.F90
r1885 r2587 106 106 PUBLIC tra_ldf_lap_adj ! routine called by tradldf_tam.F90 107 107 PUBLIC tra_ldf_lap_adj_tst ! routine called by tradldf_tam.F90 108 #if defined key_tst_tlm 108 109 PUBLIC tra_ldf_lap_tlm_tst 110 #endif 109 111 110 112 !! * Substitutions … … 735 737 736 738 END SUBROUTINE tra_ldf_lap_adj_tst 737 739 #if defined key_tst_tlm 738 740 SUBROUTINE tra_ldf_lap_tlm_tst ( kumadt ) 739 741 !!----------------------------------------------------------------------- … … 775 777 & lk_c1d 776 778 USE par_tlm, ONLY: & 779 & tlm_bch, & 777 780 & cur_loop, & 778 781 & h_ratio 779 782 USE istate_mod 780 USE wzvmod ! vertical velocity783 USE zpshde 781 784 USE gridrandom, ONLY: & 782 785 & grid_rd_sd … … 785 788 & tb, sb, tn, sn, ta, & 786 789 & sa, gtu, gsu, gtv, & 787 & gsv 790 & gsv, gru, grv, rhd 788 791 USE traldf_lap ! lateral mixing (tra_ldf routine) 789 792 USE opatam_tst_ini, ONLY: & … … 877 880 & z2r ! 2D random field 878 881 CHARACTER(LEN=14) :: cl_name 879 CHARACTER (LEN=128) :: file_out_sc, file_wop, file_out 882 CHARACTER (LEN=128) :: file_out_sc, file_wop, file_out, file_xdx 880 883 CHARACTER (LEN=90) :: & 881 884 & FMT … … 972 975 zgtv_wop(:,:) = 0.0_wp 973 976 zgsv_wop(:,:) = 0.0_wp 974 977 IF ( tlm_bch == 2 ) THEN 975 978 tb_tl(:,:,:) = 0.0_wp 976 979 sb_tl(:,:,:) = 0.0_wp … … 981 984 gtv_tl(:,:) = 0.0_wp 982 985 gsv_tl(:,:) = 0.0_wp 983 986 ENDIF 984 987 zsctb(:) = 0.0_wp 985 988 zscta(:) = 0.0_wp … … 1002 1005 ! Output filename Xn=F(X0) 1003 1006 !-------------------------------------------------------------------- 1004 file_wop='trj_wop_tldf_lap'1005 1007 CALL tlm_namrd 1006 1008 gamma = h_ratio 1009 file_wop='trj_wop_tldf_lap' 1010 file_xdx='trj_xdx_tldf_lap' 1007 1011 !-------------------------------------------------------------------- 1008 1012 ! Initialize the tangent input with random noise: dx … … 1069 1073 ! Complete Init for Direct 1070 1074 !------------------------------------------------------------------- 1071 CALL istate_p1075 IF ( tlm_bch /= 2 ) CALL istate_p 1072 1076 1073 1077 ! *** initialize the reference trajectory … … 1076 1080 CALL trj_rea( nit000, 1 ) 1077 1081 1082 ! Compute gtu, gsu, gtv, gsv 1083 CALL zps_hde(nit000, tn, sn, rhd, gtu, gsu, gru, gtv, gsv, grv) 1084 1078 1085 IF (( cur_loop .NE. 0) .OR. ( gamma .NE. 0.0_wp) )THEN 1079 1086 ztb_tlin(:,:,:) = gamma * ztb_tlin(:,:,:) … … 1101 1108 gsv(:,:) = gsv(:,:) + zgsv_tlin(:,:) 1102 1109 ENDIF 1103 IF( .NOT. lk_vvl ) CALL wzv(nit000) 1110 1104 1111 !-------------------------------------------------------------------- 1105 1112 ! Compute the direct model F(X0,t=n) = Xn 1106 1113 !-------------------------------------------------------------------- 1107 CALL tra_ldf_lap( nit000 )1108 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop)1109 1114 IF ( tlm_bch /= 2 ) CALL tra_ldf_lap( nit000 ) 1115 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 1116 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 1110 1117 !-------------------------------------------------------------------- 1111 1118 ! Compute the Tangent 1112 1119 !-------------------------------------------------------------------- 1113 IF ( cur_loop .NE. 0) THEN 1114 !-------------------------------------------------------------------- 1115 ! Storing data 1116 !-------------------------------------------------------------------- 1117 ztb_out (:,:,:) = tb (:,:,:) 1118 zsb_out (:,:,:) = sb (:,:,:) 1119 zta_out (:,:,:) = ta (:,:,:) 1120 zsa_out (:,:,:) = sa (:,:,:) 1121 zgtu_out (:,: ) = gtu (:,: ) 1122 zgsu_out (:,: ) = gsu (:,: ) 1123 zgtv_out (:,: ) = gtv (:,: ) 1124 zgsv_out (:,: ) = gsv (:,: ) 1125 1120 IF ( tlm_bch == 2 ) THEN 1126 1121 !-------------------------------------------------------------------- 1127 1122 ! Initialize the tangent variables: dy^* = W dy … … 1171 1166 zgtv_wop (:,: ) = gtv (:,: ) 1172 1167 zgsv_wop (:,: ) = gsv (:,: ) 1173 1168 CALL trj_rd_spl(file_xdx) 1169 ztb_out (:,:,:) = tb (:,:,:) 1170 zsb_out (:,:,:) = sb (:,:,:) 1171 zta_out (:,:,:) = ta (:,:,:) 1172 zsa_out (:,:,:) = sa (:,:,:) 1173 zgtu_out (:,: ) = gtu (:,: ) 1174 zgsu_out (:,: ) = gsu (:,: ) 1175 zgtv_out (:,: ) = gtv (:,: ) 1176 zgsv_out (:,: ) = gsv (:,: ) 1174 1177 !-------------------------------------------------------------------- 1175 1178 ! Compute the Linearization Error … … 1628 1631 CALL iom_close( inum ) 1629 1632 END SUBROUTINE asm_trj_wop_rd 1630 1633 #endif 1631 1634 #endif 1632 1635 !!============================================================================== -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TRA/traldf_tam.F90
r1885 r2587 11 11 !! 9.0 ! 08-06 (A. Vidard) Skeleton 12 12 !! 9.0 ! 09-03 (F. Vigilant) adding tra_ldf_lap option 13 !! 9.0 ! 10-06 (P.A. Bouttier) adding tra_ldf_bilap option 13 14 !!---------------------------------------------------------------------- 14 15 … … 25 26 & tra_ldf_lap_tan, & 26 27 & tra_ldf_lap_adj, & 27 & tra_ldf_lap_adj_tst, & 28 & tra_ldf_lap_tlm_tst 28 #if defined key_tst_tlm 29 & tra_ldf_lap_tlm_tst, & 30 #endif 31 & tra_ldf_lap_adj_tst 32 USE traldf_bilap_tam, ONLY: & !lateral mixing (tra_ldf_bilap routine) 33 & tra_ldf_bilap_tan, & 34 & tra_ldf_bilap_adj 29 35 USE in_out_manager, ONLY: & ! I/O manager 30 36 & ctl_stop, nit000, lwp, numout, nitend … … 50 56 PUBLIC tra_ldf_adj ! called by step_tam.F90 51 57 PUBLIC tra_ldf_adj_tst ! called by tamtst.F90 58 #if defined key_tst_tlm 52 59 PUBLIC tra_ldf_tlm_tst ! called by tamtst.F90 60 #endif 61 PUBLIC ldf_ctl_tam ! called by trazdf_imp (init of l_traldf_rot) 53 62 54 63 INTEGER :: nldf … … 76 85 CASE ( 0 ) ; CALL tra_ldf_lap_tan ( kt ) ! iso-level laplacian 77 86 CASE ( 1 ) ; CALL tra_ldf_iso_tan ( kt ) ! rotated laplacian (except dk[ dk[.] ] part) 87 CASE ( 2 ) ; CALL tra_ldf_bilap_tan ( kt ) ! iso-level bilaplacian 78 88 END SELECT 79 89 END SUBROUTINE tra_ldf_tan … … 94 104 CASE ( 0 ) ; CALL tra_ldf_lap_adj ( kt ) ! rotated laplacian (except dk[ dk[.] ] part) 95 105 CASE ( 1 ) ; CALL tra_ldf_iso_adj ( kt ) ! rotated laplacian (except dk[ dk[.] ] part) 106 CASE ( 2 ) ; CALL tra_ldf_bilap_adj ( kt ) ! iso-level bilaplacian 96 107 END SELECT 97 108 ! … … 206 217 207 218 IF( ln_traldf_bilap ) THEN ! bilaplacian operator 208 CALL ctl_stop( ' You shouldn t have seen this error message, ln_trad_bilap option not impemented yet for tam' ) 219 IF ( ln_zco ) THEN ! z-coordinate 220 IF ( ln_traldf_level ) nldf = 2 ! iso-level (no rotation) 221 IF ( ln_traldf_hor ) nldf = 2 ! horizontal (no rotation) 222 IF ( ln_traldf_iso ) ierr = 2 ! isoneutral ( rotation) 223 ENDIF 224 IF ( ln_zps ) THEN ! z-coordinate 225 IF ( ln_traldf_level ) ierr = 1 ! iso-level not allowed 226 IF ( ln_traldf_hor ) nldf = 2 ! horizontal (no rotation) 227 IF ( ln_traldf_iso ) ierr = 2 ! isoneutral ( rotation) 228 ENDIF 209 229 ENDIF 210 230 211 231 IF( ierr == 1 ) CALL ctl_stop( ' iso-level in z-coordinate - partial step, not allowed' ) 232 IF( ierr == 2 ) CALL ctl_stop( ' isoneutral bilaplacian operator does not exist' ) 212 233 IF( lk_traldf_eiv .AND. .NOT.ln_traldf_iso ) & 213 234 CALL ctl_stop( ' eddy induced velocity on tracers', & … … 227 248 END SUBROUTINE ldf_ctl_tam 228 249 229 250 #if defined key_tst_tlm 230 251 SUBROUTINE tra_ldf_tlm_tst( kumadt ) 231 252 !!----------------------------------------------------------------------- … … 266 287 !!====================================================================== 267 288 #endif 289 #endif 268 290 END MODULE traldf_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TRA/tranxt_tam.F90
r1885 r2587 229 229 ! 230 230 END SUBROUTINE tra_nxt_tan 231 232 231 SUBROUTINE tra_nxt_adj( kt ) 233 232 !!---------------------------------------------------------------------- … … 476 475 ! Reset the tangent and adjoint variables 477 476 !-------------------------------------------------------------------- 478 zsa_tlin(:,:,:) = 0.0_wp479 zta_tlin(:,:,:) = 0.0_wp480 zsb_tlin(:,:,:) = 0.0_wp481 ztb_tlin(:,:,:) = 0.0_wp482 zsn_tlin(:,:,:) = 0.0_wp483 ztn_tlin(:,:,:) = 0.0_wp484 zsa_adin(:,:,:) = 0.0_wp485 zta_adin(:,:,:) = 0.0_wp486 zsb_adin(:,:,:) = 0.0_wp487 ztb_adin(:,:,:) = 0.0_wp488 zsn_adin(:,:,:) = 0.0_wp489 ztn_adin(:,:,:) = 0.0_wp490 477 sb_tl(:,:,:) = 0.0_wp 491 478 tb_tl(:,:,:) = 0.0_wp … … 500 487 sn_ad(:,:,:) = 0.0_wp 501 488 tn_ad(:,:,:) = 0.0_wp 489 zsb_tlin(:,:,:) = 0.0_wp 490 ztb_tlin(:,:,:) = 0.0_wp 491 zsa_tlin(:,:,:) = 0.0_wp 492 zta_tlin(:,:,:) = 0.0_wp 493 zsn_tlin(:,:,:) = 0.0_wp 494 ztn_tlin(:,:,:) = 0.0_wp 502 495 503 496 DO jj = 1, jpj -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TRA/traqsr_tam.F90
r1947 r2587 277 277 DO ji = fs_2, fs_jpim1 ! vector opt. 278 278 ! qsr trend 279 qsr_ad(ji,jj) = qsr_ad(ji,jj) + ta_ad(ji,jj,jk) * zc0 & 280 & * ( gdsr(jk)*tmask(ji,jj,jk) - gdsr(jk+1)*tmask(ji,jj,jk+1) ) 279 qsr_ad(ji,jj) = qsr_ad(ji,jj) + ta_ad(ji,jj,jk) * zc0 * ( gdsr(jk)*tmask(ji,jj,jk) - gdsr(jk+1)*tmask(ji,jj,jk+1) ) 281 280 END DO 282 281 END DO -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TRA/trasbc_tam.F90
r1885 r2587 96 96 PUBLIC tra_sbc_adj ! routine called by step_tam.F90 97 97 PUBLIC tra_sbc_adj_tst ! routine called by tst.F90 98 #if defined key_tst_tlm 98 99 PUBLIC tra_sbc_tlm_tst ! routine calle by tamtst.F90 100 #endif 99 101 100 102 !! * Substitutions … … 579 581 END SUBROUTINE tra_sbc_adj_tst 580 582 581 583 #if defined key_tst_tlm 582 584 SUBROUTINE tra_sbc_tlm_tst ( kumadt ) 583 585 !!----------------------------------------------------------------------- … … 612 614 USE tamtrj ! writing out state trajectory 613 615 USE par_tlm, ONLY: & 616 & tlm_bch, & 614 617 & cur_loop, & 615 618 & h_ratio … … 676 679 & zgsp7 677 680 CHARACTER (LEN=14) :: cl_name 678 CHARACTER (LEN=128) :: file_out, file_wop 681 CHARACTER (LEN=128) :: file_out, file_wop, file_xdx 679 682 CHARACTER (LEN=90) :: FMT 680 683 REAL(KIND=wp), DIMENSION(100):: & … … 731 734 ! Output filename Xn=F(X0) 732 735 !-------------------------------------------------------------------- 733 file_wop='trj_wop_trasbc'734 736 CALL tlm_namrd 735 737 gamma = h_ratio 738 file_wop='trj_wop_trasbc' 739 file_xdx='trj_xdx_trasbc' 736 740 !-------------------------------------------------------------------- 737 741 ! Initialize the tangent input with random noise: dx … … 778 782 ! Complete Init for Direct 779 783 !------------------------------------------------------------------- 780 CALL istate_p784 IF ( tlm_bch /= 2 ) CALL istate_p 781 785 782 786 ! *** initialize the reference trajectory … … 804 808 ! Compute the direct model F(X0,t=n) = Xn 805 809 !-------------------------------------------------------------------- 806 CALL tra_sbc(nit000) 807 808 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 809 810 IF ( tlm_bch /= 2 ) CALL tra_sbc(nit000) 811 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 812 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 810 813 !-------------------------------------------------------------------- 811 814 ! Compute the Tangent 812 815 !-------------------------------------------------------------------- 813 IF ( cur_loop .NE. 0) THEN 814 !-------------------------------------------------------------------- 815 ! Storing data 816 !-------------------------------------------------------------------- 817 zta_out (:,:,:) = ta (:,:,:) 818 zsa_out (:,:,:) = sa (:,:,:) 819 816 IF ( tlm_bch == 2 ) THEN 820 817 !-------------------------------------------------------------------- 821 818 ! Initialize the tangent variables: dy^* = W dy … … 836 833 ! Compute the scalar product: ( L(t0,tn) gamma dx0 ) ) 837 834 !-------------------------------------------------------------------- 838 839 835 zsp2_1 = DOT_PRODUCT( ta_tl, ta_tl ) 840 836 zsp2_2 = DOT_PRODUCT( sa_tl, sa_tl ) … … 847 843 zta_wop (:,:,:) = ta (:,:,:) 848 844 zsa_wop (:,:,:) = sa (:,:,:) 845 CALL trj_rd_spl(file_xdx) 846 zta_out (:,:,:) = ta (:,:,:) 847 zsa_out (:,:,:) = sa (:,:,:) 849 848 !-------------------------------------------------------------------- 850 849 ! Compute the Linearization Error … … 981 980 !!====================================================================== 982 981 #endif 982 #endif 983 983 END MODULE trasbc_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TRA/trazdf_imp_tam.F90
r1885 r2587 74 74 & ahtw, & 75 75 & aht0 76 #if defined key_ldfslp 76 77 USE ldfslp , ONLY: & ! lateral physics: slope of diffusion 77 78 & wslpi, & !: i_slope at W-points 78 79 & wslpj !: j-slope at W-points 80 #endif 79 81 #if defined key_zdfddm 80 82 USE zdfddm , ONLY: & 81 83 & avs 82 84 #endif 85 USE traldf_tam 83 86 USE in_out_manager, ONLY: & ! I/O manager 84 87 & lwp, & … … 106 109 PUBLIC tra_zdf_imp_adj ! routine called by tra_zdf_adj.F90 107 110 PUBLIC tra_zdf_imp_adj_tst ! routine called by tst.F90 111 #if defined key_tst_tlm 108 112 PUBLIC tra_zdf_imp_tlm_tst ! routine called by tamtst.F90 113 #endif 109 114 110 115 !! * Substitutions … … 483 488 !!--------------------------------------------------------------------- 484 489 485 IF( kt == nit 000) THEN490 IF( kt == nitend ) THEN 486 491 IF(lwp)WRITE(numout,*) 487 492 IF(lwp)WRITE(numout,*) 'tra_zdf_imp_adj : implicit vertical mixing' 488 493 IF(lwp)WRITE(numout,*) '~~~~~~~~~~~~~~~ ' 494 CALL ldf_ctl_tam ! init of l_traldf_rot 489 495 zavi = 0._wp ! avoid warning at compilation phase when lk_ldfslp=F 490 496 ENDIF … … 985 991 986 992 END SUBROUTINE tra_zdf_imp_adj_tst 987 993 #if defined key_tst_tlm 988 994 SUBROUTINE tra_zdf_imp_tlm_tst( kumadt ) 989 995 !!----------------------------------------------------------------------- … … 1019 1025 USE tamtrj ! writing out state trajectory 1020 1026 USE par_tlm, ONLY: & 1027 & tlm_bch, & 1021 1028 & cur_loop, & 1022 1029 & h_ratio … … 1077 1084 CHARACTER(LEN=14) ::& 1078 1085 & cl_name 1079 CHARACTER (LEN=128) :: file_out, file_wop 1086 CHARACTER (LEN=128) :: file_out, file_wop, file_xdx 1080 1087 CHARACTER (LEN=90) :: & 1081 1088 & FMT … … 1126 1133 ! Output filename Xn=F(X0) 1127 1134 !-------------------------------------------------------------------- 1128 file_wop='trj_wop_trazdf_imp'1129 1135 CALL tlm_namrd 1130 1136 gamma = h_ratio 1137 file_wop='trj_wop_trazdf_imp' 1138 file_xdx='trj_xdx_trazdf_imp' 1131 1139 !-------------------------------------------------------------------- 1132 1140 ! Initialize the tangent input with random noise: dx … … 1169 1177 ! Complete Init for Direct 1170 1178 !------------------------------------------------------------------- 1171 CALL istate_p1179 IF ( tlm_bch /= 2 ) CALL istate_p 1172 1180 1173 1181 ! *** initialize the reference trajectory … … 1192 1200 ! Compute the direct model F(X0,t=n) = Xn 1193 1201 !-------------------------------------------------------------------- 1194 CALL tra_zdf_imp(nit000, rdttra) 1195 1196 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 1197 1202 IF ( tlm_bch /= 2 ) CALL tra_zdf_imp(nit000, rdttra) 1203 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 1204 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 1198 1205 !-------------------------------------------------------------------- 1199 1206 ! Compute the Tangent 1200 1207 !-------------------------------------------------------------------- 1201 IF ( cur_loop .NE. 0) THEN 1202 !-------------------------------------------------------------------- 1203 ! Storing data 1204 !-------------------------------------------------------------------- 1205 zta_out (:,:,:) = ta (:,:,:) 1206 zsa_out (:,:,:) = sa (:,:,:) 1208 IF ( tlm_bch == 2 ) THEN 1207 1209 !-------------------------------------------------------------------- 1208 1210 ! Initialize the tangent variables: dy^* = W dy … … 1235 1237 zta_wop (:,:,:) = ta (:,:,:) 1236 1238 zsa_wop (:,:,:) = sa (:,:,:) 1237 1239 CALL trj_rd_spl(file_xdx) 1240 zta_out (:,:,:) = ta (:,:,:) 1241 zsa_out (:,:,:) = sa (:,:,:) 1238 1242 !-------------------------------------------------------------------- 1239 1243 ! Compute the Linearization Error … … 1378 1382 END SUBROUTINE tra_zdf_imp_tlm_tst 1379 1383 #endif 1384 #endif 1380 1385 END MODULE trazdf_imp_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TRA/trazdf_tam.F90
r1885 r2587 46 46 & tra_zdf_imp_tan, & 47 47 & tra_zdf_imp_adj, & 48 & tra_zdf_imp_adj_tst, & 49 & tra_zdf_imp_tlm_tst 48 #if defined key_tst_tlm 49 & tra_zdf_imp_tlm_tst, & 50 #endif 51 & tra_zdf_imp_adj_tst 50 52 USE in_out_manager, ONLY: & ! I/O manager 51 53 & lwp, & … … 63 65 & tra_zdf_tan, & 64 66 & tra_zdf_adj ! routines called by step_tam.F90 65 PUBLIC & 66 & tra_zdf_adj_tst, & ! routine called by tst.F90 67 & tra_zdf_tlm_tst ! routine called by tst.F90 67 PUBLIC tra_zdf_adj_tst ! routine called by tst.F90 68 #if defined key_tst_tlm 69 PUBLIC tra_zdf_tlm_tst ! routine called by tst.F90 70 #endif 68 71 INTEGER :: nzdf = 0 ! type vertical diffusion algorithm used 69 72 ! ! defined from ln_zdf... namlist logicals) … … 247 250 248 251 END SUBROUTINE zdf_ctl_tam 249 252 #if defined key_tst_tlm 250 253 SUBROUTINE tra_zdf_tlm_tst( kumadt ) 251 254 !!----------------------------------------------------------------------- … … 282 285 END SUBROUTINE tra_zdf_tlm_tst 283 286 #endif 287 #endif 284 288 END MODULE trazdf_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/TRA/zpshde_tam.F90
r1885 r2587 78 78 PUBLIC zps_hde_adj ! routine called by step_tam.F90 79 79 PUBLIC zps_hde_adj_tst ! routine called by tst.F90 80 #if defined key_tst_tlm 80 81 PUBLIC zps_hde_tlm_tst ! routine called by tamtst.F90 82 #endif 81 83 82 84 !! * module variables … … 946 948 947 949 END SUBROUTINE zps_hde_adj_tst 948 950 #if defined key_tst_tlm 949 951 SUBROUTINE zps_hde_tlm_tst( kumadt ) 950 952 !!----------------------------------------------------------------------- … … 984 986 USE tamtrj ! writing out state trajectory 985 987 USE par_tlm, ONLY: & 988 & tlm_bch, & 986 989 & cur_loop, & 987 990 & h_ratio … … 1049 1052 & zgsp7 1050 1053 CHARACTER(LEN=14) :: cl_name 1051 CHARACTER (LEN=128) :: file_out, file_wop 1054 CHARACTER (LEN=128) :: file_out, file_wop, file_xdx 1052 1055 CHARACTER (LEN=90) :: FMT 1053 1056 REAL(KIND=wp), DIMENSION(100):: & … … 1104 1107 zgru_out(:,:) = 0.0_wp 1105 1108 zgrv_out(:,:) = 0.0_wp 1109 IF ( tlm_bch == 2 ) THEN 1106 1110 gtu_tl(:,:) = 0.0_wp 1107 1111 gtv_tl(:,:) = 0.0_wp … … 1110 1114 gru_tl(:,:) = 0.0_wp 1111 1115 grv_tl(:,:) = 0.0_wp 1112 1116 ENDIF 1113 1117 zscgtu(:) = 0.0_wp 1114 1118 zscgtv(:) = 0.0_wp … … 1132 1136 ! Output filename Xn=F(X0) 1133 1137 !-------------------------------------------------------------------- 1134 file_wop='trj_wop_zps'1135 1138 CALL tlm_namrd 1136 1139 gamma = h_ratio 1140 file_wop='trj_wop_zps' 1141 file_xdx='trj_xdx_zps' 1137 1142 !-------------------------------------------------------------------- 1138 1143 ! Initialize the tangent input with random noise: dx … … 1167 1172 ! Complete Init for Direct 1168 1173 !------------------------------------------------------------------- 1169 CALL istate_p 1170 1174 IF ( tlm_bch /= 2 ) CALL istate_p 1171 1175 ! *** initialize the reference trajectory 1172 1176 ! ------------ … … 1187 1191 ! Compute the direct model F(X0,t=n) = Xn 1188 1192 !-------------------------------------------------------------------- 1189 CALL zps_hde(nit000, tn, sn, rhd, gtu, gsu, gru, gtv, gsv, grv) 1190 1191 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 1192 1193 IF ( tlm_bch /= 2 ) CALL zps_hde(nit000, tn, sn, rhd, gtu, gsu, gru, gtv, gsv, grv) 1194 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 1195 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 1193 1196 !-------------------------------------------------------------------- 1194 1197 ! Compute the Tangent 1195 1198 !-------------------------------------------------------------------- 1196 IF ( cur_loop .NE. 0) THEN 1197 !-------------------------------------------------------------------- 1198 ! Storing data 1199 !-------------------------------------------------------------------- 1200 zgtu_out (:,:) = gtu (:,:) 1201 zgtv_out (:,:) = gtv (:,:) 1202 zgsu_out (:,:) = gsu (:,:) 1203 zgsv_out (:,:) = gsv (:,:) 1204 zgru_out (:,:) = gru (:,:) 1205 zgrv_out (:,:) = grv (:,:) 1206 1199 IF ( tlm_bch == 2 ) THEN 1207 1200 !-------------------------------------------------------------------- 1208 1201 ! Initialize the tangent variables: … … 1241 1234 zgru_wop (:,:) = gru (:,:) 1242 1235 zgrv_wop (:,:) = grv (:,:) 1236 CALL trj_rd_spl(file_xdx) 1237 zgtu_out (:,:) = gtu (:,:) 1238 zgtv_out (:,:) = gtv (:,:) 1239 zgsu_out (:,:) = gsu (:,:) 1240 zgsv_out (:,:) = gsv (:,:) 1241 zgru_out (:,:) = gru (:,:) 1242 zgrv_out (:,:) = grv (:,:) 1243 1243 !-------------------------------------------------------------------- 1244 1244 ! Compute the Linearization Error … … 1471 1471 !!====================================================================== 1472 1472 #endif 1473 #endif 1473 1474 END MODULE zpshde_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/cla_dynspg_tam.F90
r1885 r2587 31 31 & lwp, & 32 32 & numout, & 33 & nit000 33 & nit000, & 34 & nitend 34 35 USE dom_oce , ONLY: & ! Ocean space and time domain 35 36 & mi0, & … … 330 331 ! Control print 331 332 ! ------------- 332 IF( kt == nit 000) THEN333 IF( kt == nitend ) THEN 333 334 IF(lwp) WRITE(numout,*) 334 335 IF(lwp) WRITE(numout,*) 'cla_dynspg_adj : cross land advection on surface ' … … 486 487 ! we convert in m3 487 488 zempmed = zempmed * 1.e-3_wp 488 489 !!!! AW: Adjoint of this????490 IF( lk_mpp ) CALL mpp_sum( zempmed ) ! sum with other processors value491 489 492 490 ! minus 2 points in Red Sea and 3 in Atlantic … … 504 502 END DO 505 503 504 IF( lk_mpp ) CALL mpp_sum( zempmed ) ! sum with other processors value 505 506 506 ! compute the emp in Mediterranean Sea 507 507 ij0 = 96 ; ij1 = 110 -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/dotprodfld.F90
r1885 r2587 10 10 !! * Modules used 11 11 USE par_kind 12 USE dom_oce 12 USE dom_oce, ONLY : & 13 & nldi, & 14 & nldj, & 15 & nlei, & 16 & nlej 17 USE par_oce , ONLY: & ! Ocean space and time domain variables 18 & jpi, & 19 & jpj, & 20 & jpk 21 13 22 USE mppsumtam 14 23 -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/eosbn2_tam.F90
r1885 r2587 130 130 PUBLIC eos_adj_tst 131 131 PUBLIC bn2_adj_tst 132 #if defined key_tst_tlm 132 133 PUBLIC eos_tlm_tst 133 134 PUBLIC bn2_tlm_tst 135 #endif 134 136 #endif 135 137 … … 3057 3059 3058 3060 END SUBROUTINE bn2_adj_tst 3059 3061 #if defined key_tst_tlm 3060 3062 SUBROUTINE eos_insitu_tlm_tst( kumadt ) 3061 3063 !!----------------------------------------------------------------------- … … 3091 3093 USE tamtrj ! writing out state trajectory 3092 3094 USE par_tlm, ONLY: & 3095 & tlm_bch, & 3093 3096 & cur_loop, & 3094 3097 & h_ratio … … 3134 3137 & jk 3135 3138 CHARACTER(LEN=14) :: cl_name 3136 CHARACTER (LEN=128) :: file_out_sc, file_wop, file_out 3139 CHARACTER (LEN=128) :: file_out_sc, file_wop, file_out, file_xdx 3137 3140 CHARACTER (LEN=90) :: FMT 3138 3141 REAL(KIND=wp), DIMENSION(100):: & … … 3160 3163 zs_tlin( :,:,:) = 0.0_wp 3161 3164 zrd_out( :,:,:) = 0.0_wp 3162 zrd_tl ( :,:,:) = 0.0_wp3163 3165 zrd_wop( :,:,:) = 0.0_wp 3164 3166 zscerrrd(:) = 0.0_wp 3165 3167 zscrd(:) = 0.0_wp 3166 3168 IF ( tlm_bch == 2 ) zrd_tl ( :,:,:) = 0.0_wp 3167 3169 !-------------------------------------------------------------------- 3168 3170 ! Output filename Xn=F(X0) 3169 3171 !-------------------------------------------------------------------- 3170 file_wop='trj_wop_eos_insitu'3171 3172 CALL tlm_namrd 3172 3173 gamma = h_ratio 3174 file_wop='trj_wop_eos_insitu' 3175 file_xdx='trj_xdx_eos_insitu' 3173 3176 !-------------------------------------------------------------------- 3174 3177 ! Initialize the tangent input with random noise: dx … … 3196 3199 ! Complete Init for Direct 3197 3200 !------------------------------------------------------------------- 3198 CALL istate_p3201 IF ( tlm_bch /= 2 ) CALL istate_p 3199 3202 3200 3203 ! *** initialize the reference trajectory … … 3213 3216 ! Compute the direct model F(X0,t=n) = Xn 3214 3217 !-------------------------------------------------------------------- 3215 CALL eos(tn, sn, zrd_out)3218 IF ( tlm_bch /= 2 ) CALL eos(tn, sn, zrd_out) 3216 3219 rhd(:,:,:)= zrd_out(:,:,:) 3217 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 3220 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 3221 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 3218 3222 !-------------------------------------------------------------------- 3219 3223 ! Compute the Tangent 3220 3224 !-------------------------------------------------------------------- 3221 IF ( cur_loop .NE. 0) THEN 3222 !-------------------------------------------------------------------- 3223 ! Storing data 3224 !-------------------------------------------------------------------- 3225 IF ( tlm_bch == 2 ) THEN 3225 3226 !-------------------------------------------------------------------- 3226 3227 ! Initialize the tangent variables: dy^* = W dy … … 3241 3242 CALL trj_rd_spl(file_wop) 3242 3243 zrd_wop (:,:,:) = rhd (:,:,:) 3243 3244 CALL trj_rd_spl(file_xdx) 3245 zrd_out (:,:,:) = rhd (:,:,:) 3244 3246 !-------------------------------------------------------------------- 3245 3247 ! Compute the Linearization Error … … 3367 3369 USE tamtrj ! writing out state trajectory 3368 3370 USE par_tlm, ONLY: & 3371 & tlm_bch, & 3369 3372 & cur_loop, & 3370 3373 & h_ratio … … 3416 3419 & jk 3417 3420 CHARACTER(LEN=14) :: cl_name 3418 CHARACTER (LEN=128) :: file_out, file_wop 3421 CHARACTER (LEN=128) :: file_out, file_wop,file_xdx 3419 3422 CHARACTER (LEN=90) :: FMT 3420 3423 REAL(KIND=wp), DIMENSION(100):: & … … 3447 3450 zrd_out( :,:,:) = 0.0_wp 3448 3451 zrh_out( :,:,:) = 0.0_wp 3449 zrd_tl ( :,:,:) = 0.0_wp3450 zrh_tl ( :,:,:) = 0.0_wp3451 3452 zrd_wop( :,:,:) = 0.0_wp 3452 3453 zrh_wop( :,:,:) = 0.0_wp … … 3455 3456 zscrd(:) = 0.0_wp 3456 3457 zscrh(:) = 0.0_wp 3457 3458 IF ( tlm_bch == 2 ) THEN 3459 zrd_tl ( :,:,:) = 0.0_wp 3460 zrh_tl ( :,:,:) = 0.0_wp 3461 ENDIF 3458 3462 !-------------------------------------------------------------------- 3459 3463 ! Output filename Xn=F(X0) 3460 3464 !-------------------------------------------------------------------- 3461 file_wop='trj_wop_eos_pot'3462 3465 CALL tlm_namrd 3463 3466 gamma = h_ratio 3467 file_wop='trj_wop_eos_pot' 3468 file_xdx='trj_xdx_eos_pot' 3464 3469 !-------------------------------------------------------------------- 3465 3470 ! Initialize the tangent input with random noise: dx … … 3486 3491 ! Complete Init for Direct 3487 3492 !------------------------------------------------------------------- 3488 CALL istate_p3493 IF ( tlm_bch /= 2 ) CALL istate_p 3489 3494 3490 3495 ! *** initialize the reference trajectory … … 3503 3508 ! Compute the direct model F(X0,t=n) = Xn 3504 3509 !-------------------------------------------------------------------- 3505 CALL eos(tn, sn, zrd_out, zrh_out)3510 IF ( tlm_bch /= 2 ) CALL eos(tn, sn, zrd_out, zrh_out) 3506 3511 rhd (:,:,:) = zrd_out(:,:,:) 3507 3512 rhop(:,:,:) = zrh_out(:,:,:) 3508 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 3513 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 3514 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 3509 3515 !-------------------------------------------------------------------- 3510 3516 ! Compute the Tangent 3511 3517 !-------------------------------------------------------------------- 3512 IF ( cur_loop .NE. 0) THEN 3513 !-------------------------------------------------------------------- 3514 ! Storing data 3515 !-------------------------------------------------------------------- 3518 IF ( tlm_bch == 2 ) THEN 3516 3519 !-------------------------------------------------------------------- 3517 3520 ! Initialize the tangent variables: dy^* = W dy … … 3536 3539 zrd_wop (:,:,:) = rhd (:,:,:) 3537 3540 zrh_wop (:,:,:) = rhop (:,:,:) 3538 3541 CALL trj_rd_spl(file_xdx) 3542 zrd_out (:,:,:) = rhd (:,:,:) 3543 zrh_out (:,:,:) = rhop (:,:,:) 3539 3544 !-------------------------------------------------------------------- 3540 3545 ! Compute the Linearization Error … … 3695 3700 USE tamtrj ! writing out state trajectory 3696 3701 USE par_tlm, ONLY: & 3702 & tlm_bch, & 3697 3703 & cur_loop, & 3698 3704 & h_ratio … … 3741 3747 & jj 3742 3748 CHARACTER(LEN=14) :: cl_name 3743 CHARACTER (LEN=128) :: file_out, file_wop 3749 CHARACTER (LEN=128) :: file_out, file_wop, file_xdx 3744 3750 CHARACTER (LEN=90) :: FMT 3745 3751 REAL(KIND=wp), DIMENSION(100):: & … … 3771 3777 zs_tlin( :,:) = 0.0_wp 3772 3778 zrd_out( :,:) = 0.0_wp 3773 zrd_tl ( :,:) = 0.0_wp3774 3779 zrd_wop( :,:) = 0.0_wp 3775 3780 zscerrrd( :) = 0.0_wp 3776 3781 zscrd(:) = 0.0_wp 3777 3782 IF ( tlm_bch == 2 ) zrd_tl ( :,:) = 0.0_wp 3778 3783 !-------------------------------------------------------------------- 3779 3784 ! Output filename Xn=F(X0) 3780 3785 !-------------------------------------------------------------------- 3781 file_wop='trj_wop_eos_2d'3782 3783 3786 CALL tlm_namrd 3784 3787 gamma = h_ratio 3788 file_wop='trj_wop_eos_2d' 3789 file_xdx='trj_xdx_eos_2d' 3785 3790 !-------------------------------------------------------------------- 3786 3791 ! Initialize the tangent input with random noise: dx … … 3804 3809 ! Complete Init for Direct 3805 3810 !------------------------------------------------------------------- 3806 CALL istate_p3811 IF ( tlm_bch /= 2 ) CALL istate_p 3807 3812 ! *** initialize the reference trajectory 3808 3813 ! ------------ … … 3824 3829 ! Compute the direct model F(X0,t=n) = Xn 3825 3830 !-------------------------------------------------------------------- 3826 CALL eos(ztem, zsal, zdep, zrd_out)3831 IF ( tlm_bch /= 2 ) CALL eos(ztem, zsal, zdep, zrd_out) 3827 3832 rhd (:,:,2) = zrd_out(:,:) 3828 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 3833 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 3834 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 3829 3835 !-------------------------------------------------------------------- 3830 3836 ! Compute the Tangent 3831 3837 !-------------------------------------------------------------------- 3832 IF ( cur_loop .NE. 0) THEN 3833 !-------------------------------------------------------------------- 3834 ! Storing data 3835 !-------------------------------------------------------------------- 3838 IF ( tlm_bch == 2 ) THEN 3836 3839 !-------------------------------------------------------------------- 3837 3840 ! Initialize the tangent variables: dy^* = W dy … … 3854 3857 CALL trj_rd_spl(file_wop) 3855 3858 zrd_wop (:,:) = rhd (:,:,2) 3859 CALL trj_rd_spl(file_xdx) 3860 zrd_out (:,:) = rhd (:,:,2) 3856 3861 !-------------------------------------------------------------------- 3857 3862 ! Compute the Linearization Error … … 3976 3981 USE tamtrj ! writing out state trajectory 3977 3982 USE par_tlm, ONLY: & 3983 & tlm_bch, & 3978 3984 & cur_loop, & 3979 3985 & h_ratio … … 4023 4029 & z3r 4024 4030 CHARACTER(LEN=14) :: cl_name 4025 CHARACTER (LEN=128) :: file_out, file_wop 4031 CHARACTER (LEN=128) :: file_out, file_wop, file_xdx 4026 4032 CHARACTER (LEN=90) :: FMT 4027 4033 REAL(KIND=wp), DIMENSION(100):: & … … 4051 4057 ! Output filename Xn=F(X0) 4052 4058 !-------------------------------------------------------------------- 4053 file_wop='trj_wop_bn2'4054 4055 4059 CALL tlm_namrd 4056 4060 gamma = h_ratio 4061 file_wop='trj_wop_bn2' 4062 file_xdx='trj_xdx_bn2' 4057 4063 !-------------------------------------------------------------------- 4058 4064 ! Initialize the tangent input with random noise: dx … … 4079 4085 ! Complete Init for Direct 4080 4086 !------------------------------------------------------------------- 4081 CALL istate_p4087 IF ( tlm_bch /= 2 ) CALL istate_p 4082 4088 4083 4089 ! *** initialize the reference trajectory … … 4098 4104 ! Compute the direct model F(X0,t=n) = Xn 4099 4105 !-------------------------------------------------------------------- 4100 CALL bn2(tn, sn, rn2) 4101 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 4106 IF ( tlm_bch /= 2 ) CALL bn2(tn, sn, rn2) 4107 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 4108 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 4102 4109 !-------------------------------------------------------------------- 4103 4110 ! Compute the Tangent 4104 4111 !-------------------------------------------------------------------- 4105 IF ( cur_loop .NE. 0) THEN 4106 !-------------------------------------------------------------------- 4107 ! Storing data 4108 !-------------------------------------------------------------------- 4109 zrn2_out (:,:,:) = rn2 (:,:,:) 4110 4112 IF ( tlm_bch == 2 ) THEN 4111 4113 !-------------------------------------------------------------------- 4112 4114 ! Initialize the tangent variables: dy^* = W dy … … 4131 4133 CALL trj_rd_spl(file_wop) 4132 4134 zrn2_wop (:,:,:) = rn2 (:,:,:) 4133 4135 CALL trj_rd_spl(file_xdx) 4136 zrn2_out (:,:,:) = rn2 (:,:,:) 4134 4137 !-------------------------------------------------------------------- 4135 4138 ! Compute the Linearization Error … … 4244 4247 END SUBROUTINE eos_tlm_tst 4245 4248 #endif 4249 #endif 4246 4250 !!====================================================================== 4247 4251 END MODULE eosbn2_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/istate_tam.F90
r1885 r2587 45 45 # endif 46 46 # endif 47 & tmask, umask, vmask 47 & tmask, umask, vmask, & 48 & n_cla 48 49 USE daymod , ONLY: & 49 50 & day_init … … 61 62 USE eosbn2_tam , ONLY: & 62 63 & eos_tan, eos_adj 64 USE divcur_tam , ONLY: & 65 & div_cur_tan, div_cur_adj 66 USE cla_div_tam , ONLY: & 67 & div_cla_tan, div_cla_adj 63 68 USE tstool_tam , ONLY: & 64 69 & prntst_adj, & … … 119 124 sb_tl (:,:,:) = sn_tl (:,:,:) 120 125 sshb_tl ( :,:) = sshn_tl ( :,:) 121 rotb_tl (:,:,:) = rotn_tl (:,:,:) 126 ! 127 rotb_tl (:,:,:) = rotn_tl (:,:,:) ! Update before fields 122 128 hdivb_tl(:,:,:) = hdivn_tl(:,:,:) 123 !124 129 125 130 -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/mpp_tam.F90
r1885 r2587 47 47 & mpp_sum_reals, & 48 48 & mpp_global_or, & 49 & mpp_global_max_real 49 & mpp_global_max_real, & 50 & mpp_global_max_real2 50 51 51 52 CONTAINS … … 151 152 SUBROUTINE mpp_global_max_real( zin, zout ) 152 153 !!---------------------------------------------------------------------- 153 !! *** ROUTINE mpp_global_ or***154 !! *** ROUTINE mpp_global_max_real *** 154 155 !! 155 156 !! ** Purpose : Copy a local zin array to a global array and … … 213 214 END SUBROUTINE mpp_global_max_real 214 215 216 217 SUBROUTINE mpp_global_max_real2( zin, zout ) 218 !!---------------------------------------------------------------------- 219 !! *** ROUTINE mpp_global_max_real2 *** 220 !! 221 !! ** Purpose : Copy a local zin array to a global array and 222 !! apply the "max" operation for all elements in 223 !! a global (jpiglo,jpjglo) array across processors 224 !! 225 !! ** Method : MPI allreduce 226 !! 227 !! ** Action : This does only work for MPI. 228 !! It does not work for SHMEM. 229 !! 230 !! References : http://www.mpi-forum.org 231 !! 232 !! History : 233 !! ! 08-01 (K. Mogensen) Original code 234 !!---------------------------------------------------------------------- 235 236 !! * Arguments 237 REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: & 238 & zin 239 REAL(wp), DIMENSION(jpiglo,jpjglo), INTENT(OUT) :: & 240 & zout 241 !! * Local declarations 242 INTEGER :: & 243 & ierr 244 #if defined key_mpp_mpi 245 #include <mpif.h> 246 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: & 247 & zcp 248 INTEGER :: & 249 & ji, & 250 & jj 251 252 ! Copy data for input to MPI 253 254 ALLOCATE( & 255 & zcp(jpiglo,jpjglo) & 256 & ) 257 zcp(:,:) = -1e+38 258 DO jj = nldj, nlej 259 DO ji = nldi, nlei 260 zcp(mig(ji),mjg(jj)) = zin(ji,jj) 261 ENDDO 262 ENDDO 263 264 ! Call the MPI library to find the coast lines globally 265 266 CALL mpi_allreduce( zcp, zout, jpiglo*jpjglo, mpivar, & 267 & mpi_max, mpi_comm_opa, ierr ) 268 269 DEALLOCATE( & 270 & zcp & 271 & ) 272 273 #elif defined key_mpp_shmem 274 #error "Only MPI support for MPP in NEMOVAR" 275 #else 276 zout(:,:) = zin(:,:) 277 #endif 278 279 END SUBROUTINE mpp_global_max_real2 280 215 281 END MODULE mpp_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/nemotam.F90
r1885 r2587 28 28 USE phycst ! physical constant (par_cst routine) 29 29 USE tamtrj ! handling of the trajectory 30 USE trj_tam ! handling of the trajectory 30 31 USE tamctl ! Control parameters 31 32 USE oce_tam ! TL and adjoint data … … 33 34 USE trc_oce_tam ! Trend tangent and adjoint arrays 34 35 USE sol_oce_tam ! Solver tangent and adjoint arrays 35 USE tamtst ! Gradient testing36 USE tamtst 36 37 ! ocean physics 37 38 #if defined key_tam … … 41 42 USE zdfini 42 43 44 #if defined key_tst_tlm 43 45 #if defined key_tam 44 46 USE opatam_tst_ini, ONLY : & … … 47 49 & opatam_4_tst_ini 48 50 #endif 51 #endif 49 52 50 53 IMPLICIT NONE … … 109 112 !! * Local declarations 110 113 CHARACTER (len=128) :: file_out = 'nemovar.output' 111 CHARACTER (len=*), PARAMETER :: namelistname = 'namelist.nemo var'114 CHARACTER (len=*), PARAMETER :: namelistname = 'namelist.nemotam' 112 115 NAMELIST/namctl/ ln_ctl, nprint, nictls, nictle, & 113 116 & isplt , jsplt , njctls, njctle, nbench, nbit_cmp … … 127 130 128 131 ! Nodes selection 129 n area= mynode()130 narea = n area+ 1 ! mynode return the rank of proc (0 --> jpnij -1 )132 nproc = mynode() 133 narea = nproc + 1 ! mynode return the rank of proc (0 --> jpnij -1 ) 131 134 lwp = narea == 1 135 ln_rstart = .FALSE. 132 136 133 137 ! open additionnal listing … … 185 189 CALL tam_trj_ini 186 190 191 CALL day_init 187 192 CALL day( nit000 ) 188 193 … … 204 209 205 210 !! * Local declarations 206 NAMELIST/namtst/ ln_tst, ln_tst_bkgadj, ln_tst_obsadj, ln_tst_nemotam, & 207 & ln_tst_grad, ln_tst_cpd_tam, ln_tst_stp_tam, & 208 & ln_tst_tan_cpd, ln_tst_tan 211 NAMELIST/namtst/ ln_tst_nemotam, ln_tst_cpd_tam, ln_tst_stp_tam, & 212 & ln_tst_tan_cpd, ln_tst_tan, ln_tst_stop 209 213 210 214 REAL(wp) :: & … … 241 245 i_flag_rc = 0 242 246 243 ln_tst = .TRUE.244 ln_tst_obsadj = .FALSE.245 ln_tst_bkgadj = .FALSE.246 247 ln_tst_nemotam = .FALSE. 247 ln_tst_grad = .FALSE.248 248 ln_tst_cpd_tam = .FALSE. 249 249 ln_tst_stp_tam = .FALSE. 250 250 ln_tst_tan_cpd = .FALSE. 251 251 ln_tst_tan = .FALSE. 252 ln_tst_stop = .FALSE. 252 253 253 254 REWIND( numnam ) … … 258 259 WRITE(numout,*) ' namtst' 259 260 WRITE(numout,*) ' ' 260 WRITE(numout,*) ' master switch for operator tests ln_tst = ',ln_tst261 WRITE(numout,*) ' switch for H adjoint tests ln_tst_obsadj = ',ln_tst_obsadj262 WRITE(numout,*) ' switch for B adjoint tests ln_tst_bkgadj = ',ln_tst_bkgadj263 261 WRITE(numout,*) ' switch for M adjoint tests ln_tst_nemotam = ',ln_tst_nemotam 264 WRITE(numout,*) ' s witch for gradient test ln_tst_grad = ',ln_tst_grad262 WRITE(numout,*) ' stop after tests ln_tst_stop = ',ln_tst_stop 265 263 WRITE(numout,*) ' ' 266 264 … … 269 267 ! B.4 Tests 270 268 271 IF ( ln_tst ) CALL tstopt269 IF ( ln_tst_nemotam ) CALL tsttam 272 270 273 271 END SUBROUTINE nemotam_sub … … 296 294 IF ( lk_mpp ) CALL mppsync 297 295 296 ! Deallocate variables 297 ! -------------------- 298 CALL oce_tam_deallocate ( 0 ) 299 CALL sol_oce_tam_deallocate ( 0 ) 300 #if defined key_tam 301 CALL sbc_oce_tam_deallocate ( 0 ) 302 CALL trc_oce_tam_deallocate ( 0 ) 303 #endif 304 CALL trj_deallocate 298 305 ! Unit close 299 306 ! ---------- … … 301 308 CLOSE( numnam ) ! namelist 302 309 CLOSE( numout ) ! standard model output file 303 IF ( .NOT.lini ) THEN310 IF ( lini ) THEN 304 311 CLOSE( numtan_sc ) ! tangent test diagnostic output 305 312 CLOSE( numtan ) ! tangent diagnostic output … … 349 356 !!---------------------------------------------------------------------- 350 357 !! * Local declarations 351 NAMELIST/namtst/ ln_tst, ln_tst_bkgadj, ln_tst_obsadj, ln_tst_nemotam, & 352 & ln_tst_grad, ln_tst_cpd_tam, ln_tst_stp_tam, & 353 & ln_tst_tan_cpd, ln_tst_tan 358 NAMELIST/namtst/ ln_tst_nemotam, ln_tst_cpd_tam, ln_tst_stp_tam, & 359 & ln_tst_tan_cpd, ln_tst_tan, ln_tst_stop 354 360 CHARACTER (len=*), PARAMETER :: namelistname = 'namelist.nemotam' 355 361 !! * Arguments 356 362 357 ln_tst = .TRUE.358 ln_tst_obsadj = .FALSE.359 ln_tst_bkgadj = .FALSE.360 363 ln_tst_nemotam = .FALSE. 361 ln_tst_grad = .FALSE.362 364 ln_tst_cpd_tam = .FALSE. 363 365 ln_tst_stp_tam = .FALSE. 364 366 ln_tst_tan_cpd = .FALSE. 365 367 ln_tst_tan = .FALSE. 368 ln_tst_stop = .TRUE. 366 369 367 370 CALL ctlopn( numnam, namelistname, 'OLD', 'FORMATTED', 'SEQUENTIAL', & … … 372 375 373 376 IF ( ln_tst_tan ) THEN 377 #if defined key_tst_tlm 374 378 CALL opa_opatam_ini 375 379 lini = .FALSE. ! not standard initialisation 380 #else 381 CALL ctl_stop( 'Activate key_tst_tlm for ln_tst_tan=.true.' ) 382 #endif 376 383 ELSE 377 384 CALL nemotam_init -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/oce_tam.F90
r1885 r2587 34 34 PUBLIC & 35 35 & oce_tam_init, & !: Initialize the TAM fields 36 & oce_tam_deallocate, & 36 37 !: 37 38 & ub_tl, & !: Tangent linear of before u-component velocity … … 788 789 789 790 END SUBROUTINE oce_tam_init 791 SUBROUTINE oce_tam_deallocate ( kindic ) 792 !!----------------------------------------------------------------------- 793 !! 794 !! *** ROUTINE oce_tam_deallocate *** 795 !! 796 !! ** Purpose : Deallocate the tangent linear and 797 !! adjoint arrays 798 !! 799 !! ** Method : kindic = 0 deallocate both tl and ad variables 800 !! kindic = 1 deallocate only tl variables 801 !! kindic = 2 deallocate only ad variables 802 !! 803 !! ** Action : 804 !! 805 !! References : 806 !! 807 !! History : 808 !! ! 2010-06 (A. Vidard) initial version 809 !!----------------------------------------------------------------------- 810 !! * Arguments 811 INTEGER, INTENT(IN) :: & 812 & kindic ! indicate which variables to allocate/initialize 813 814 !! * Local declarations 815 ! Dellocate tangent linear variable arrays 816 ! --------------------------------------- 817 818 IF ( kindic == 0 .OR. kindic == 1 ) THEN 819 820 IF ( ALLOCATED(ub_tl) ) DEALLOCATE( ub_tl ) 821 822 IF ( ALLOCATED(un_tl) ) DEALLOCATE( un_tl ) 823 824 IF ( ALLOCATED(ua_tl) ) DEALLOCATE( ua_tl ) 825 826 IF ( ALLOCATED(vb_tl) ) DEALLOCATE( vb_tl ) 827 828 IF ( ALLOCATED(vn_tl) ) DEALLOCATE( vn_tl ) 829 830 IF ( ALLOCATED(va_tl) ) DEALLOCATE( va_tl ) 831 832 IF ( ALLOCATED(wn_tl) ) DEALLOCATE( wn_tl ) 833 834 IF ( ALLOCATED(rotb_tl) ) DEALLOCATE( rotb_tl ) 835 836 IF ( ALLOCATED(rotn_tl) ) DEALLOCATE( rotn_tl ) 837 838 IF ( ALLOCATED(hdivb_tl) ) DEALLOCATE( hdivb_tl ) 839 840 IF ( ALLOCATED(hdivn_tl) ) DEALLOCATE( hdivn_tl ) 841 842 IF ( ALLOCATED(tb_tl) ) DEALLOCATE( tb_tl ) 843 844 IF ( ALLOCATED(tn_tl) ) DEALLOCATE( tn_tl ) 845 846 IF ( ALLOCATED(ta_tl) ) DEALLOCATE( ta_tl ) 847 848 IF ( ALLOCATED(sb_tl) ) DEALLOCATE( sb_tl ) 849 850 IF ( ALLOCATED(sn_tl) ) DEALLOCATE( sn_tl ) 851 852 IF ( ALLOCATED(sa_tl) ) DEALLOCATE( sa_tl ) 853 854 IF ( ALLOCATED(rhd_tl) ) DEALLOCATE( rhd_tl ) 855 856 IF ( ALLOCATED(rhop_tl) ) DEALLOCATE( rhop_tl ) 857 858 IF ( ALLOCATED(rn2_tl) ) DEALLOCATE( rn2_tl ) 859 860 IF ( ALLOCATED(spgu_tl) ) DEALLOCATE( spgu_tl ) 861 862 IF ( ALLOCATED(spgv_tl) ) DEALLOCATE( spgv_tl ) 863 864 #if defined key_dynspg_rl 865 IF ( ALLOCATED(bsfb_tl) ) DEALLOCATE( bsfb_tl ) 866 867 IF ( ALLOCATED(bsfn_tl) ) DEALLOCATE( bsfn_tl ) 868 869 IF ( ALLOCATED(bsfd_tl) ) DEALLOCATE( bsfd_tl ) 870 871 #else 872 IF (ALLOCATED(sshb_tl) ) DEALLOCATE( sshb_tl ) 873 874 IF (ALLOCATED(sshn_tl) ) DEALLOCATE( sshn_tl ) 875 876 IF (ALLOCATED(ssha_tl) ) DEALLOCATE( ssha_tl ) 877 878 IF (ALLOCATED(sshu_tl) ) DEALLOCATE( sshu_tl ) 879 880 IF (ALLOCATED(sshv_tl) ) DEALLOCATE( sshv_tl ) 881 882 IF (ALLOCATED(sshbb_tl) ) DEALLOCATE( sshbb_tl ) 883 884 #endif 885 IF ( ALLOCATED(gtu_tl) ) DEALLOCATE( gtu_tl ) 886 887 IF ( ALLOCATED(gtv_tl) ) DEALLOCATE( gtv_tl ) 888 889 IF ( ALLOCATED(gsu_tl) ) DEALLOCATE( gsu_tl ) 890 891 IF ( ALLOCATED(gsv_tl) ) DEALLOCATE( gsv_tl ) 892 893 IF ( ALLOCATED(gru_tl) ) DEALLOCATE( gru_tl ) 894 895 IF ( ALLOCATED(grv_tl) ) DEALLOCATE( grv_tl ) 896 897 898 899 #if defined key_zdfddm 900 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 901 !!!! AW: The declaration/allocation/initialization of these variables 902 !!!! should be moved to a new module zdf_ddm_tam_init to be consistent 903 !!!! with NEMO. 904 IF ( ALLOCATED(rrau_tl) ) DEALLOCATE( rrau_tl ) 905 906 907 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 908 #endif 909 910 911 ENDIF 912 913 IF ( kindic == 0 .OR. kindic == 2 ) THEN 914 915 ! Allocate adjoint variable arrays 916 ! -------------------------------- 917 918 IF ( ALLOCATED(ub_ad) ) DEALLOCATE( ub_ad ) 919 920 IF ( ALLOCATED(un_ad) ) DEALLOCATE( un_ad ) 921 922 IF ( ALLOCATED(ua_ad) ) DEALLOCATE( ua_ad ) 923 924 IF ( ALLOCATED(vb_ad) ) DEALLOCATE( vb_ad ) 925 926 IF ( ALLOCATED(vn_ad) ) DEALLOCATE( vn_ad ) 927 928 IF ( ALLOCATED(va_ad) ) DEALLOCATE( va_ad ) 929 930 IF ( ALLOCATED(wn_ad) ) DEALLOCATE( wn_ad ) 931 932 IF ( ALLOCATED(rotb_ad) ) DEALLOCATE( rotb_ad ) 933 934 IF ( ALLOCATED(rotn_ad) ) DEALLOCATE( rotn_ad ) 935 936 IF ( ALLOCATED(hdivb_ad) ) DEALLOCATE( hdivb_ad ) 937 938 IF ( ALLOCATED(hdivn_ad) ) DEALLOCATE( hdivn_ad ) 939 940 IF ( ALLOCATED(tb_ad) ) DEALLOCATE( tb_ad ) 941 942 IF ( ALLOCATED(tn_ad) ) DEALLOCATE( tn_ad ) 943 944 IF ( ALLOCATED(ta_ad) ) DEALLOCATE( ta_ad ) 945 946 IF ( ALLOCATED(sb_ad) ) DEALLOCATE( sb_ad ) 947 948 IF ( ALLOCATED(sn_ad) ) DEALLOCATE( sn_ad ) 949 950 IF ( ALLOCATED(sa_ad) ) DEALLOCATE( sa_ad ) 951 952 IF ( ALLOCATED(rhd_ad) ) DEALLOCATE( rhd_ad ) 953 954 IF ( ALLOCATED(rhop_ad) ) DEALLOCATE( rhop_ad ) 955 956 IF ( ALLOCATED(rn2_ad) ) DEALLOCATE( rn2_ad ) 957 958 IF ( ALLOCATED(spgu_ad) ) DEALLOCATE( spgu_ad ) 959 960 IF ( ALLOCATED(spgv_ad) ) DEALLOCATE( spgv_ad ) 961 962 #if defined key_dynspg_rl 963 IF ( ALLOCATED(bsfb_ad) ) DEALLOCATE( bsfb_ad ) 964 965 IF ( ALLOCATED(bsfn_ad) ) DEALLOCATE( bsfn_ad ) 966 967 IF ( ALLOCATED(bsfd_ad) ) DEALLOCATE( bsfd_ad ) 968 969 #else 970 IF ( ALLOCATED(sshb_ad) ) DEALLOCATE( sshb_ad ) 971 972 IF ( ALLOCATED(sshn_ad) ) DEALLOCATE( sshn_ad ) 973 974 IF ( ALLOCATED(ssha_ad) ) DEALLOCATE( ssha_ad ) 975 976 IF ( ALLOCATED(sshu_ad) ) DEALLOCATE( sshu_ad ) 977 978 IF ( ALLOCATED(sshv_ad) ) DEALLOCATE( sshv_ad ) 979 980 IF ( ALLOCATED(sshbb_ad) ) DEALLOCATE( sshbb_ad ) 981 982 #endif 983 IF ( ALLOCATED(gtu_ad) ) DEALLOCATE( gtu_ad ) 984 985 IF ( ALLOCATED(gtv_ad) ) DEALLOCATE( gtv_ad ) 986 987 IF ( ALLOCATED(gsu_ad) ) DEALLOCATE( gsu_ad ) 988 989 IF ( ALLOCATED(gsv_ad) ) DEALLOCATE( gsv_ad ) 990 991 IF ( ALLOCATED(gru_ad) ) DEALLOCATE( gru_ad ) 992 993 IF ( ALLOCATED(grv_ad) ) DEALLOCATE( grv_ad ) 994 995 996 997 #if defined key_zdfddm 998 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 999 !!!! AW: The declaration/allocation/initialization of these variables 1000 !!!! should be moved to a new module zdf_ddm_tam_init to be consistent 1001 !!!! with NEMO. 1002 IF ( ALLOCATED(rrau_ad) ) DEALLOCATE( rrau_ad ) 1003 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 1004 #endif 1005 1006 ENDIF 1007 1008 END SUBROUTINE oce_tam_deallocate 790 1009 791 1010 END MODULE oce_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/opatam_tst_init.F90
r2586 r2587 1 1 MODULE opatam_tst_ini 2 2 #if defined key_tam 3 #if defined key_tst_tlm 3 4 !!============================================================================== 4 5 !! *** MODULE opatam_tst_init *** … … 67 68 ! ocean physics 68 69 USE zdfini 69 ! USE nemotam, ONLY: &70 ! & nemotam_banner71 70 USE opa 71 USE par_tlm 72 72 73 73 IMPLICIT NONE … … 100 100 !!---------------------------------------------------------------------- 101 101 102 ! CALL opa_model 102 ! Initialization 103 CALL opa_hdr_ini 104 IF(lwp) WRITE(numout,cform_aaa) ! Flag AAAAAAA 105 CALL opa_flg ! Control prints & Benchmark 106 CALL tlm_namrd 107 108 SELECT CASE (tlm_bch) 109 CASE ( 0, 1 ) 103 110 CALL opa_4_tst_ini 111 CASE ( 2 ) 104 112 CALL opatam_4_tst_ini 113 CASE DEFAULT 114 CALL ctl_stop( ' Wrong Value of tlm_bch') 115 END SELECT 116 105 117 106 118 END SUBROUTINE opa_opatam_ini … … 120 132 INTEGER :: itro, istp0 ! ??? 121 133 #endif 122 !!#if defined key_oasis3 || defined key_oasis4123 !! INTEGER :: localComm124 !!#endif125 !! CHARACTER (len=20) :: namelistname126 !! CHARACTER (len=28) :: file_out127 !! NAMELIST/namctl/ ln_ctl, nprint, nictls, nictle, &128 !! & isplt , jsplt , njctls, njctle, nbench, nbit_cmp129 !!----------------------------------------------------------------------130 134 131 135 ! Initializations 132 136 ! =============== 133 134 CALL opa_hdr_ini135 137 136 138 ! ! ============================== ! 137 139 ! ! Model general initialization ! 138 140 ! ! ============================== ! 139 140 IF(lwp) WRITE(numout,cform_aaa) ! Flag AAAAAAA141 142 CALL opa_flg ! Control prints & Benchmark143 141 144 142 ! Domain decomposition … … 183 181 #endif 184 182 185 CALL dia_ptr_init ! Poleward Transports initialization186 183 IF(lwp) WRITE(numout,*)'Euler time step switch is ', neuler 187 184 ldirinit = .TRUE. 188 185 189 186 CALL tam_trj_ini 190 ! ! =============== ! 191 ! ! time stepping !192 ! ! =============== !187 188 CALL day_init 189 CALL day(nit000) 193 190 194 191 IF(lwp) WRITE(numout,cform_aaa) ! Flag AAAAAAA … … 232 229 WRITE(numout,*) 233 230 234 ! Already opened in nemotam_root235 ! namelistname = 'namelist.nemovar'236 ! CALL ctlopn( numnam, namelistname, 'OLD', 'FORMATTED', 'SEQUENTIAL', &237 ! & 1, numout, .FALSE., 1 )238 239 231 ! Namelist namctl : Control prints & Benchmark 240 232 REWIND( numnam ) … … 247 239 #else 248 240 ! Nodes selection 249 narea = mynode() 241 nproc = mynode() 242 narea = nproc + 1 ! mynode return the rank of proc (0 --> jpnij -1 ) 250 243 #endif 251 244 narea = narea + 1 ! mynode return the rank of proc (0 --> jpnij -1 ) … … 255 248 ! IF( ln_ctl ) THEN 256 249 IF( narea-1 > 0 ) THEN 257 WRITE(file_out,FMT="('nemo var.output_',I4.4)") narea-1250 WRITE(file_out,FMT="('nemotam_tst.output_',I4.4)") narea-1 258 251 CALL ctlopn( numout, file_out, 'UNKNOWN', 'FORMATTED', & 259 252 & 'SEQUENTIAL', 1, numout, .FALSE., 1 ) … … 292 285 !! * Local declarations 293 286 CHARACTER (len=128) :: file_out !!= 'nemovar.output' 294 !! CHARACTER (len=*), PARAMETER :: namelistname = 'namelist.nemovar' 295 !! NAMELIST/namctl/ ln_ctl, nprint, nbit_cmp, nabortx, ln_smslabel, & 296 !! & nn_smsfrq 297 298 ! open listing and namelist units 299 !! CALL ctlopn( numout, file_out, 'UNKNOWN', 'FORMATTED', & 300 !! & 'SEQUENTIAL', 1, numout, .FALSE., 1 ) 301 !! CALL nemotam_banner( numout ) 302 303 !! CALL ctlopn( numnam, namelistname, 'OLD', 'FORMATTED', 'SEQUENTIAL', & 304 !! & 1, numout, .FALSE., 1 ) 305 306 ! Namelist namctl : Control prints & Benchmark 307 !! REWIND( numnam ) 308 !! READ ( numnam, namctl ) 309 310 IF ( .NOT. ldirinit) CALL opa_hdr_ini ! Initialization 287 311 288 312 289 ! Nodes selection 313 n area= mynode()314 narea = n area+ 1 ! mynode return the rank of proc (0 --> jpnij -1 )290 nproc = mynode() 291 narea = nproc + 1 ! mynode return the rank of proc (0 --> jpnij -1 ) 315 292 lwp = narea == 1 316 293 … … 349 326 IF (lwp) THEN 350 327 ! Diagnostic file for tangent test 351 !WRITE(file_out,FMT="('tan_diag.output_',I4.4)") , narea-1328 WRITE(file_out,FMT="('tan_diag.output_',I4.4)") , narea-1 352 329 CALL ctlopn( numtan, file_out, 'UNKNOWN', 'FORMATTED', & 353 330 & 'SEQUENTIAL', 1, numtan, .FALSE., 1 ) … … 363 340 IF (lwp) THEN 364 341 ! Diagnostic file for tangent test (scalar sampling) 365 !WRITE(file_out,FMT="('tan_diag_sc.output_',I4.4)") , narea-1342 WRITE(file_out,FMT="('tan_diag_sc.output_',I4.4)") , narea-1 366 343 CALL ctlopn( numtan_sc, file_out, 'UNKNOWN', 'FORMATTED', & 367 344 & 'SEQUENTIAL', 1, numtan_sc, .FALSE., 1 ) … … 398 375 399 376 IF ( .NOT. ldirinit) CALL tam_trj_ini 377 378 CALL day_init 400 379 IF ( .NOT. ldirinit) CALL day( nit000 ) 401 380 … … 403 382 404 383 #endif 384 neuler=1 405 385 406 386 IF(lwp) WRITE(numout,cform_aaa) ! Flag AAAAAAA … … 575 555 & numnam, & 576 556 & lwp 577 USE par_tlm, ONLY: &578 & cur_loop, &579 & h_ratio580 557 !! * Local declarations 581 558 582 NAMELIST/namtst_tlm/ cur_loop, h_ratio559 NAMELIST/namtst_tlm/ tlm_bch, cur_loop, h_ratio 583 560 584 561 ! Read Namelist namflg : algorithm FLaG … … 594 571 WRITE(numout,*) '~~~~~~~~~' 595 572 WRITE(numout,*) ' Namelist namtst_tlm : set algorithm parameters' 573 WRITE(numout,*) ' current branch test = ' , tlm_bch 596 574 WRITE(numout,*) ' current loop iteration = ' , cur_loop 597 575 WRITE(numout,*) ' current h_ratio applied = ' , h_ratio … … 603 581 !!====================================================================== 604 582 #endif 583 #endif 605 584 END MODULE opatam_tst_ini -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/ran_num.F90
r1885 r2587 13 13 USE dom_oce ! Domain variables 14 14 USE in_out_manager ! I/O stuff 15 USE mt19937ar, ONLY : & 16 & init_mtrand, & 17 & mtrand_real1 15 18 16 19 IMPLICIT NONE … … 118 121 119 122 END FUNCTION gausva 120 121 FUNCTION psrandom( kdum )122 !!----------------------------------------------------------------------123 !! *** ROUTINE psrandom ***124 !!125 !! ** Purpose : Pseudo-Random number generator.126 !!127 !! ** Method : Returns a pseudo-random number from a uniform distribution128 !! between 0 and 1129 !! Call with kdum a negative integer to initialize.130 !! Thereafter, do not alter kdum between successive deviates131 !! in sequence.132 !!133 !! ** Action :134 !!135 !! History :136 !! ! 10-02 (F. Vigilant) Original code137 !!----------------------------------------------------------------------138 !! * Function return139 REAL(wp) :: &140 & psrandom141 !! * Arguments142 INTEGER, INTENT(INOUT) :: &143 & kdum ! Seed144 LOGICAL, SAVE :: &145 & llinit = .FALSE.146 147 ! Initialization148 IF ( .NOT. llinit ) THEN149 150 CALL srand( kdum )151 llinit = .TRUE.152 153 ENDIF154 155 CALL rand(psrandom)156 157 END FUNCTION psrandom158 159 123 160 124 FUNCTION gaustb_2d( ki, kj, kseed, pamp, pmean ) … … 241 205 IF ( niset(ki,kj) == 0 ) THEN 242 206 243 zv1 = 2.0_wp * psrandom _2d( ki, kj, kdum) - 1.0_wp244 zv2 = 2.0_wp * psrandom _2d( ki, kj, kdum) - 1.0_wp207 zv1 = 2.0_wp * psrandom( kdum(ki,kj) ) - 1.0_wp 208 zv2 = 2.0_wp * psrandom( kdum(ki,kj) ) - 1.0_wp 245 209 zrsq = zv1**2 + zv2**2 246 210 247 211 DO WHILE ( ( zrsq >= 1.0_wp ) .OR. ( zrsq == 0.0_wp ) ) 248 212 249 zv1 = 2.0_wp * psrandom _2d( ki, kj, kdum) - 1.0_wp250 zv2 = 2.0_wp * psrandom _2d( ki, kj, kdum) - 1.0_wp213 zv1 = 2.0_wp * psrandom( kdum(ki,kj) ) - 1.0_wp 214 zv2 = 2.0_wp * psrandom( kdum(ki,kj) ) - 1.0_wp 251 215 zrsq = zv1**2 + zv2**2 252 216 … … 267 231 END FUNCTION gausva_2d 268 232 269 FUNCTION psrandom _2d( ki, kj, kdum )270 !!---------------------------------------------------------------------- 271 !! *** ROUTINE psrandom _2d***272 !! 273 !! ** Purpose : Random number generator.233 FUNCTION psrandom( kdum ) 234 !!---------------------------------------------------------------------- 235 !! *** ROUTINE psrandom *** 236 !! 237 !! ** Purpose : Pseudo-Random number generator. 274 238 !! 275 239 !! ** Method : Returns a pseudo-random number from a uniform distribution … … 286 250 !! * Function return 287 251 REAL(wp) :: & 288 & psrandom_2d 289 !! * Arguments 290 INTEGER, INTENT(IN) :: & 291 & ki, & ! Indices in seed array 292 & kj 293 INTEGER, INTENT(INOUT), DIMENSION(jpi,jpj) :: & 252 & psrandom 253 !! * Arguments 254 INTEGER, INTENT(INOUT) :: & 294 255 & kdum ! Seed 295 256 LOGICAL, SAVE :: & 296 257 & llinit = .FALSE. 258 INTEGER :: & 259 & kdum1, & 260 & kdum2 297 261 298 262 ! Initialization 299 263 IF ( .NOT. llinit ) THEN 300 301 CALL srand( kdum( ki,kj ) ) 264 kdum2 = 596035 265 kdum1 = kdum + nproc * kdum2 266 CALL init_mtrand(kdum) 302 267 llinit = .TRUE. 303 304 ENDIF 305 306 CALL rand(psrandom_2d) 268 ENDIF 269 270 psrandom = mtrand_real1() 307 271 308 END FUNCTION psrandom_2d 272 END FUNCTION psrandom 273 309 274 310 275 END MODULE ran_num -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/step_tam.F90
r1885 r2587 43 43 & tb, sb, tn, sn, ta, & 44 44 & un, vn, sshn, sshb, & 45 & sa, ub, vb, 45 & sa, ub, vb, rn2, & 46 46 & ln_dynhpg_imp 47 47 USE zdfkpp , ONLY: & … … 76 76 & ln_traqsr 77 77 ! solar radiation penetration flag 78 USE asminc 79 USE asmbkg 78 80 USE oce_tam , ONLY: & ! Tangent linear and adjoint variables 79 81 & oce_tam_init, & … … 134 136 USE wzvmod_tam ! vertical velocity (adjoint of wzv routine) 135 137 136 USE zdfkpp_tam ! KPP vertical mixing 137 138 !! USE zdfkpp_tam ! KPP vertical mixing 139 USE zdf_oce, ONLY : lk_zdfcst, avt, avt0, avmu, avmv, avm0, ln_zdfevd ! KPP vertical mixing 140 USE zdfddm, ONLY : & ! double diffusion mixing (zdf_ddm routine) 141 & lk_zdfddm, & 142 & zdf_ddm 143 USE zdfevd, only:zdf_evd ! double diffusion mixing (zdf_ddm routine) 144 USE zdfbfr, only:zdf_bfr ! double diffusion mixing (zdf_ddm routine) 145 USE zdfmxl, only:zdf_mxl ! double diffusion mixing (zdf_ddm routine) 146 USE eosbn2, ONLY: bn2 138 147 USE zpshde_tam ! partial step: hor. derivative (adjoint of zps_hde routine) 139 148 … … 186 195 PUBLIC stp_tan, & 187 196 & stp_adj, & ! called by simvar.F90 197 #if defined key_tst_tlm 188 198 & stp_tlm_tst, & 199 #endif 189 200 & stp_adj_tst 190 201 … … 257 268 ! Output the initial state and forcings ... not needed in tangent 258 269 259 ! saving direct variables ua,va, ta, sa before entering in tracer260 zta_tmp (:,:,:) = ta (:,:,:)261 zsa_tmp (:,:,:) = sa (:,:,:)262 270 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 263 271 ! Ocean physics update … … 315 323 316 324 #endif 317 318 ta (:,:,:) = zta_tmp (:,:,:)319 sa (:,:,:) = zsa_tmp (:,:,:)320 325 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 321 326 ! Active tracers … … 1184 1189 1185 1190 END SUBROUTINE stp_adj_tst 1186 1191 #if defined key_tst_tlm 1187 1192 SUBROUTINE stp_tlm_tst( kumadt ) 1188 1193 !!----------------------------------------------------------------------- … … 1228 1233 & lk_c1d 1229 1234 USE par_tlm, ONLY: & 1235 & tlm_bch, & 1230 1236 & cur_loop, & 1231 1237 & h_ratio … … 1262 1268 & zgsp1, zgsp2, zgsp3, zgsp4, zgsp5, & 1263 1269 & zgsp6, zgsp7 1270 REAL(KIND=wp) :: & 1271 & zgsp1_U, zgsp1_V, zgsp1_T, zgsp1_S, zgsp1_SSH, & 1272 & zgsp4_U, zgsp4_V, zgsp4_T, zgsp4_S, zgsp4_SSH, & 1273 & zgsp5_U, zgsp5_V, zgsp5_T, zgsp5_S, zgsp5_SSH 1264 1274 REAL(KIND=wp), DIMENSION(:,:,:), ALLOCATABLE :: & 1265 1275 & ta_tmp , & … … 1288 1298 1289 1299 CHARACTER(LEN=14) :: cl_name 1290 CHARACTER (LEN=128) :: file_out, file_wop, file_wop2 1300 CHARACTER (LEN=128) :: file_out, file_wop, file_wop2, file_xdx 1291 1301 CHARACTER (LEN=90) :: FMT 1292 1302 … … 1388 1398 ! Output filename Xn=F(X0) 1389 1399 !-------------------------------------------------------------------- 1390 file_wop='trj_wop_step'1391 1400 CALL tlm_namrd 1392 1401 gamma = h_ratio 1402 file_wop='trj_wop_step' 1403 file_xdx='trj_xdx_step' 1393 1404 !-------------------------------------------------------------------- 1394 1405 ! Initialize the tangent input with random noise: dx … … 1450 1461 ENDIF 1451 1462 ENDIF 1452 CALL istate_p1463 IF ( tlm_bch /= 2 ) CALL istate_p 1453 1464 1454 1465 !-------------------------------------------------------------------- … … 1456 1467 !-------------------------------------------------------------------- 1457 1468 1458 PRINT*,'IN TST_STP h_ratio, cur_loop, gamma', h_ratio, ' ',cur_loop,' ', gamma1459 Call flush(numout)1460 1461 1469 ! check that all process are still there... If some process have an error, 1462 1470 ! they will never enter in step and other processes will wait until the end of the cpu time! … … 1464 1472 1465 1473 istp = nit000 1474 IF ( tlm_bch /= 2 ) THEN 1466 1475 IF( lk_c1d ) THEN ! 1D configuration (no AGRIF zoom) 1467 !1468 1476 DO WHILE ( istp <= nitend .AND. nstop == 0 ) 1469 1477 CALL stp_c1d( istp ) 1470 1478 istp = istp + 1 1471 1479 END DO 1472 ELSE 1473 istp = nit000 - 1 1474 IF( ln_trjwri ) CALL tam_trj_wri( istp ) ! Output trajectory fields 1480 ENDIF 1475 1481 ENDIF 1476 1482 … … 1497 1503 ! Compute the direct model F(X0,t=n) = Xn 1498 1504 !-------------------------------------------------------------------- 1505 IF ( tlm_bch /= 2 ) THEN 1499 1506 DO istp = nit000, nitend, 1 1500 1507 CALL stp( istp ) 1501 1508 END DO 1502 IF ( cur_loop .EQ. 0) CALL trj_wri_spl(file_wop) 1503 1509 ENDIF 1510 IF ( tlm_bch == 0 ) CALL trj_wri_spl(file_wop) 1511 IF ( tlm_bch == 1 ) CALL trj_wri_spl(file_xdx) 1504 1512 !-------------------------------------------------------------------- 1505 1513 ! Compute the Tangent 1506 1514 !-------------------------------------------------------------------- 1507 IF ( cur_loop .NE. 0) THEN 1508 1509 !-------------------------------------------------------------------- 1510 ! Storing data 1511 !-------------------------------------------------------------------- 1512 zun_out (:,:,:) = un (:,:,:) 1513 zvn_out (:,:,:) = vn (:,:,:) 1514 ztn_out (:,:,:) = tn (:,:,:) 1515 zsn_out (:,:,:) = sn (:,:,:) 1516 zsshn_out (:,: ) = sshn (:,: ) 1515 IF ( tlm_bch == 2 ) THEN 1517 1516 1518 1517 !-------------------------------------------------------------------- … … 1520 1519 !-------------------------------------------------------------------- 1521 1520 qrp_tl = 0.0_wp 1522 1521 #if defined key_tradmp 1522 strdmp_tl = 0.0_wp 1523 ttrdmp_tl = 0.0_wp 1524 #endif 1523 1525 a_fwb_tl = 0.0_wp 1524 1526 … … 1535 1537 ! Initialization of the dynamics and tracer fields for the tangent 1536 1538 !----------------------------------------------------------------------- 1539 1537 1540 CALL istate_init_tan 1541 1538 1542 DO istp = nit000, nitend, 1 1539 1543 CALL stp_tan( istp ) 1544 !CALL stp_tan_cpd( istp ) 1540 1545 END DO 1541 1546 … … 1556 1561 !-------------------------------------------------------------------- 1557 1562 CALL trj_rd_spl(file_wop) 1558 1559 1563 zun_wop (:,:,:) = un (:,:,:) 1560 1564 zvn_wop (:,:,:) = vn (:,:,:) … … 1562 1566 zsn_wop (:,:,:) = sn (:,:,:) 1563 1567 zsshn_wop (:,: ) = sshn (:,: ) 1568 CALL trj_rd_spl(file_xdx) 1569 zun_out (:,:,:) = un (:,:,:) 1570 zvn_out (:,:,:) = vn (:,:,:) 1571 ztn_out (:,:,:) = tn (:,:,:) 1572 zsn_out (:,:,:) = sn (:,:,:) 1573 zsshn_out (:,: ) = sshn (:,: ) 1564 1574 !-------------------------------------------------------------------- 1565 1575 ! Compute the Linearization Error … … 1711 1721 zzsp_SSH = SQRT(zsp3_SSH) 1712 1722 zgsp5 = zzsp 1723 zgsp5_U=zzsp_U 1724 zgsp5_V=zzsp_V 1725 zgsp5_T=zzsp_T 1726 zgsp5_S=zzsp_S 1727 zgsp5_SSH=zzsp_SSH 1713 1728 CALL prntst_tlm( cl_name, kumadt, zzsp, h_ratio ) 1714 1729 … … 1729 1744 zzsp_SSH = SQRT(zsp2_SSH) 1730 1745 zgsp4 = zzsp 1746 zgsp4_U=zzsp_U 1747 zgsp4_V=zzsp_V 1748 zgsp4_T=zzsp_T 1749 zgsp4_S=zzsp_S 1750 zgsp4_SSH=zzsp_SSH 1731 1751 cl_name = 'step_tam:Ln2 ' 1732 1752 CALL prntst_tlm( cl_name, kumadt, zzsp, h_ratio ) … … 1761 1781 zgsp7 = zgsp3/gamma 1762 1782 zgsp1 = zzsp 1783 zgsp1_U=zzsp_U 1784 zgsp1_V=zzsp_V 1785 zgsp1_T=zzsp_T 1786 zgsp1_S=zzsp_S 1787 zgsp1_SSH=zzsp_SSH 1763 1788 zgsp2 = zgsp1 / zgsp4 1764 1789 zgsp6 = (zgsp2 - 1.0_wp)/gamma 1765 1790 1766 1791 FMT = "(A8,2X,I4.4,2X,E6.1,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13,2X,E20.13)" 1767 WRITE(numtan,FMT) 'step ', cur_loop, h_ratio, zgsp1, zgsp2, zgsp3, zgsp4, zgsp5, zgsp6, zgsp7 1768 1792 1793 WRITE(numtan,FMT) 'step ', cur_loop, h_ratio, zgsp1, zgsp1_T ,zgsp4_T, zgsp5_T,zgsp1_S,zgsp4_S,zgsp5_S!, 1769 1794 !-------------------------------------------------------------------- 1770 1795 ! Unitary calculus … … 1921 1946 !!====================================================================== 1922 1947 #endif 1948 #endif 1923 1949 END MODULE step_tam -
branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/stpctl_tam.F90
r1885 r2587 161 161 IF(lwp) WRITE(numout,*) ' ==>> time-step= ',kt,' abs(U) max: ', zumax 162 162 ENDIF 163 ! IF( zumax > 100.) THEN 164 IF( zumax > 500.) THEN 163 IF( zumax > 50.) THEN 165 164 IF( lk_mpp ) THEN 166 165 CALL mpp_maxloc(ABS(un_tl),umask,zumax,ii,ij,ik) … … 173 172 IF(lwp) THEN 174 173 WRITE(numout,cform_err) 175 WRITE(numout,*) ' stpctl_tan: the zonal velocity is larger than 20 m/s'174 WRITE(numout,*) ' stpctl_tan: the zonal velocity is larger than 50 m/s' 176 175 WRITE(numout,*) ' ========= ' 177 176 WRITE(numout,9400) kt, zumax, ii, ij, ik … … 197 196 IF(lwp) WRITE(numout,*) ' ==>> time-step= ',kt,' abs(V) max: ', zvmax 198 197 ENDIF 199 ! IF( zvmax > 100.) THEN 200 IF( zvmax > 500.) THEN 198 IF( zvmax > 50.) THEN 201 199 IF( lk_mpp ) THEN 202 200 CALL mpp_maxloc(ABS(vn_tl),vmask,zvmax,ii,ij,ik) … … 209 207 IF(lwp) THEN 210 208 WRITE(numout,cform_err) 211 WRITE(numout,*) ' stpctl_tan: the meridional velocity is larger than 10 m/s'209 WRITE(numout,*) ' stpctl_tan: the meridional velocity is larger than 50 m/s' 212 210 WRITE(numout,*) ' ========= ' 213 211 WRITE(numout,9410) kt, zvmax, ii, ij, ik … … 232 230 IF(lwp) WRITE(numout,*) ' ==>> time-step= ',kt,' abs(T) max: ', zTmax 233 231 ENDIF 234 ! IF( ztmax > 300.) THEN 235 IF( ztmax > 600.) THEN 232 IF( ztmax > 80.) THEN 236 233 IF( lk_mpp ) THEN 237 234 CALL mpp_maxloc(ABS(tn_tl),tmask,ztmax,ii,ij,ik) … … 244 241 IF(lwp) THEN 245 242 WRITE(numout,cform_err) 246 WRITE(numout,*) ' stpctl_tan: the temperature is larger than 30 K'243 WRITE(numout,*) ' stpctl_tan: the temperature is larger than 80 K' 247 244 WRITE(numout,*) ' ========= ' 248 245 WRITE(numout,9420) kt, ztmax, ii, ij, ik … … 268 265 IF(lwp) WRITE(numout,*) ' ==>> time-step= ',kt,' abs(S) max: ', zsmax 269 266 ENDIF