Changeset 12080 for utils/tools/SIREN/src/date.f90
- Timestamp:
- 2019-12-06T10:30:14+01:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
utils/tools/SIREN/src/date.f90
r9598 r12080 3 3 !---------------------------------------------------------------------- 4 4 ! 5 ! MODULE: date6 !7 5 ! DESCRIPTION: 8 6 !> @brief This module provide the calculation of Julian dates, and … … 117 115 !> 118 116 !> @author J.Paul 119 ! REVISION HISTORY:117 !> 120 118 !> @date November, 2013 - Initial Version 121 119 ! 122 120 !> @note This module is based on Perderabo's date calculator (ksh) 123 !> @note Software governed by the CeCILL licence ( ./LICENSE)121 !> @note Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 124 122 !> 125 123 !> @todo … … 127 125 !---------------------------------------------------------------------- 128 126 MODULE date 127 129 128 USE global ! global variable 130 129 USE kind ! F90 kind parameter 131 130 USE fct ! basic useful function 132 131 USE logger ! log file manager 132 133 133 IMPLICIT NONE 134 134 ! NOTE_avoid_public_variables_if_possible … … 143 143 PUBLIC :: date_today !< return the date of the day at 12:00:00 144 144 PUBLIC :: date_now !< return the date and time 145 PUBLIC :: date_time !< return the date and time in milliseconds 145 146 PUBLIC :: date_init !< initialized date structure form julian day or year month day 146 147 PUBLIC :: date_print !< print the date with format YYYY-MM-DD hh:mm:ss … … 207 208 208 209 CONTAINS 210 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 211 FUNCTION date_print(td_date, cd_fmt) & 212 & RESULT (cf_date) 209 213 !------------------------------------------------------------------- 210 214 !> @brief This function print the date and time with 211 215 !> format YYYY/MM/DD hh:mm:ss. 212 216 !> @details 213 !> Optionally, you could specify output format. However it will be only apply214 !> to year, month, day.215 !> 216 !> @author J.Paul 217 !> @date November, 2013 - Initial Version 218 ! 217 !> Optionally, you could specify output format. However it will be 218 !> only apply to year, month, day. 219 !> 220 !> @author J.Paul 221 !> @date November, 2013 - Initial Version 222 !> 219 223 !> @param[in] td_date date strutcutre 220 224 !> @param[in] cd_fmt ouput format (only for year,month,day) 221 225 !> @return date in format YYYY-MM-DD hh:mm:ss 222 226 !------------------------------------------------------------------- 223 CHARACTER(LEN=lc) FUNCTION date_print(td_date, cd_fmt) 224 IMPLICIT NONE 227 228 IMPLICIT NONE 229 225 230 ! Argument 226 231 TYPE(TDATE) , INTENT(IN) :: td_date 227 232 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: cd_fmt 233 234 ! function 235 CHARACTER(LEN=lc) :: cf_date 228 236 !---------------------------------------------------------------- 229 237 230 238 IF( PRESENT(cd_fmt) )THEN 231 WRITE( date_print,TRIM(cd_fmt)) &232 & td_date%i_year,td_date%i_month,td_date%i_day239 WRITE(cf_date,TRIM(cd_fmt)) & 240 & td_date%i_year,td_date%i_month,td_date%i_day 233 241 ELSE 234 WRITE( date_print,cm_fmtdate) &235 & td_date%i_year,td_date%i_month,td_date%i_day, &236 & td_date%i_hour,td_date%i_min,td_date%i_sec242 WRITE(cf_date,cm_fmtdate) & 243 & td_date%i_year,td_date%i_month,td_date%i_day, & 244 & td_date%i_hour,td_date%i_min,td_date%i_sec 237 245 ENDIF 238 246 239 247 END FUNCTION date_print 248 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 FUNCTION date_leapyear(td_date) & 250 & RESULT (lf_leap) 240 251 !------------------------------------------------------------------- 241 252 !> @brief This function check if year is a leap year. … … 243 254 !> @author J.Paul 244 255 !> @date November, 2013 - Initial Version 245 ! 256 !> 246 257 !> @param[in] td_date date strutcutre 247 258 !> @return true if year is leap year 248 259 !------------------------------------------------------------------- 249 LOGICAL FUNCTION date_leapyear(td_date) 250 IMPLICIT NONE 260 261 IMPLICIT NONE 262 251 263 ! Argument 252 264 TYPE(TDATE), INTENT(IN) :: td_date 253 !---------------------------------------------------------------- 254 255 date_leapyear=.false. 265 266 ! function 267 LOGICAL :: lf_leap 268 !---------------------------------------------------------------- 269 270 lf_leap=.false. 256 271 IF( (MOD(td_date%i_year,100_i4)==0) )THEN 257 272 IF( (MOD(td_date%i_year,400_i4)==0) )THEN 258 date_leapyear=.true.273 lf_leap=.true. 259 274 ENDIF 260 275 ELSE 261 276 IF( (MOD(td_date%i_year,4_i4)==0) )THEN 262 date_leapyear=.true.277 lf_leap=.true. 263 278 ENDIF 264 ENDIF 279 ENDIF 265 280 266 281 END FUNCTION date_leapyear 282 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 FUNCTION date_now() & 284 & RESULT (tf_date) 267 285 !------------------------------------------------------------------- 268 286 !> @brief This function return the current date and time. … … 270 288 !> @author J.Paul 271 289 !> @date November, 2013 - Initial Version 272 ! 290 !> 273 291 !> @return current date and time in a date structure 274 292 !------------------------------------------------------------------- 275 TYPE(TDATE) FUNCTION date_now() 276 IMPLICIT NONE 293 294 IMPLICIT NONE 295 296 ! function 297 TYPE(TDATE) :: tf_date 298 277 299 ! local variable 278 300 INTEGER(sp), DIMENSION(8) :: il_values … … 281 303 CALL DATE_AND_TIME( values= il_values) 282 304 283 date_now=date_init( il_values(1), il_values(2), il_values(3), &284 &il_values(5), il_values(6), il_values(7) )305 tf_date=date_init( il_values(1), il_values(2), il_values(3), & 306 & il_values(5), il_values(6), il_values(7) ) 285 307 286 308 END FUNCTION date_now 287 !------------------------------------------------------------------- 288 !> @brief This function return the date of the day at 12:00:00. 289 !> 290 !> @author J.Paul 291 !> @date November, 2013 - Initial Version 292 ! 293 !> @return date of the day at 12:00:00 in a date structure 294 !------------------------------------------------------------------- 295 TYPE(TDATE) FUNCTION date_today() 296 IMPLICIT NONE 309 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 SUBROUTINE date_time() 311 !------------------------------------------------------------------- 312 !> @brief This subroutine print the current date and time in milliseconds. 313 !> 314 !> @author J.Paul 315 !> @date August, 2017 - Initial Version 316 !------------------------------------------------------------------- 317 318 IMPLICIT NONE 319 297 320 ! local variable 298 321 INTEGER(sp), DIMENSION(8) :: il_values 322 CHARACTER(LEN=lc) :: cl_fmtdate = & !< date and time format 323 & "(i0.4,'-',i0.2,'-',i0.2,1x,i0.2,':',i0.2,':',i0.2'.',i0.3)" 299 324 !---------------------------------------------------------------- 300 325 301 326 CALL DATE_AND_TIME( values= il_values) 302 327 303 date_today=date_init( il_values(1), il_values(2), il_values(3), 12_i4 ) 328 WRITE(*,cl_fmtdate) il_values(1),il_values(2),il_values(3),il_values(5),il_values(6),il_values(7),il_values(8) 329 330 END SUBROUTINE date_time 331 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 332 FUNCTION date_today() & 333 & RESULT (tf_date) 334 !------------------------------------------------------------------- 335 !> @brief This function return the date of the day at 12:00:00. 336 !> 337 !> @author J.Paul 338 !> @date November, 2013 - Initial Version 339 !> 340 !> @return date of the day at 12:00:00 in a date structure 341 !------------------------------------------------------------------- 342 343 IMPLICIT NONE 344 345 ! function 346 TYPE(TDATE) :: tf_date 347 348 ! local variable 349 INTEGER(sp), DIMENSION(8) :: il_values 350 !---------------------------------------------------------------- 351 352 CALL DATE_AND_TIME( values= il_values) 353 354 tf_date=date_init( il_values(1), il_values(2), il_values(3), 12_i4 ) 304 355 305 356 END FUNCTION date_today 357 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 358 FUNCTION date__init_fmtdate(cd_datetime, td_dateo) & 359 & RESULT (tf_date) 306 360 !------------------------------------------------------------------- 307 361 !> @brief This function initialized date structure from a character … … 313 367 !> @author J.Paul 314 368 !> @date November, 2013 - Initial Version 315 ! 369 !> @date April, 2019 370 !> - check time units CF convention, raise error if not 371 !> 316 372 !> @param[in] cd_date date in format YYYY-MM-DD hh:mm:ss 317 373 !> @param[in] td_dateo new date origin for pseudo julian day 318 374 !> @return date structure 319 375 !------------------------------------------------------------------- 320 TYPE(TDATE) FUNCTION date__init_fmtdate(cd_datetime, td_dateo) 321 IMPLICIT NONE 376 377 IMPLICIT NONE 378 322 379 ! Argument 323 380 CHARACTER(LEN=*), INTENT(IN) :: cd_datetime 324 381 TYPE(TDATE), INTENT(IN), OPTIONAL :: td_dateo 382 383 ! function 384 TYPE(TDATE) :: tf_date 325 385 326 386 ! local variable … … 334 394 CHARACTER(LEN=lc) :: cl_min 335 395 CHARACTER(LEN=lc) :: cl_sec 336 337 INTEGER(i4) :: il_year 338 INTEGER(i4) :: il_month 339 INTEGER(i4) :: il_day 340 INTEGER(i4) :: il_hour 341 INTEGER(i4) :: il_min 342 INTEGER(i4) :: il_sec 396 CHARACTER(LEN=lc) :: cl_msg 397 398 INTEGER(i4) :: il_year 399 INTEGER(i4) :: il_month 400 INTEGER(i4) :: il_day 401 INTEGER(i4) :: il_hour 402 INTEGER(i4) :: il_min 403 INTEGER(i4) :: il_sec 343 404 !---------------------------------------------------------------- 344 405 … … 355 416 READ(cl_day, *) il_day 356 417 cl_hour = fct_split(cl_time,1,':') 357 READ(cl_hour, *) il_hour 418 IF( TRIM(cl_hour) /= '' )THEN 419 READ(cl_hour, *) il_hour 420 ELSE 421 WRITE(cl_msg,*) "time units not conform to CF conventions" 422 CALL logger_error(cl_msg) 423 il_hour=0 424 ENDIf 358 425 cl_min = fct_split(cl_time,2,':') 359 READ(cl_min, *) il_min 426 IF( TRIM(cl_min) /= '' )THEN 427 READ(cl_min, *) il_min 428 ELSE 429 WRITE(cl_msg,*) "time units not conform to CF conventions" 430 CALL logger_error(cl_msg) 431 il_min=0 432 ENDIf 360 433 cl_sec = fct_split(cl_time,3,':') 361 READ(cl_sec, *) il_sec 362 363 date__init_fmtdate = date_init( il_year, il_month, il_day, il_hour, & 364 & il_min, il_sec, td_dateo=td_dateo ) 434 IF( TRIM(cl_sec) /= '' )THEN 435 READ(cl_sec, *) il_sec 436 ELSE 437 WRITE(cl_msg,*) "time units not conform to CF conventions" 438 CALL logger_error(cl_msg) 439 il_sec=0 440 ENDIf 441 442 tf_date = date_init( il_year, il_month, il_day, il_hour, & 443 & il_min, il_sec, td_dateo=td_dateo ) 365 444 366 445 END FUNCTION date__init_fmtdate 446 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 FUNCTION date__init_jd(dd_jd, td_dateo) & 448 & RESULT (tf_date) 367 449 !------------------------------------------------------------------- 368 450 !> @brief This function initialized date structure from julian day.<br/> … … 373 455 !> @author J.Paul 374 456 !> @date November, 2013 - Initial Version 375 ! 457 !> 376 458 !> @param[in] dd_jd julian day 377 459 !> @param[in] td_dateo new date origin for pseudo julian day 378 ! 460 !> 379 461 !> @return date structure of julian day 380 462 !------------------------------------------------------------------- 381 TYPE(TDATE) FUNCTION date__init_jd(dd_jd, td_dateo) 382 IMPLICIT NONE 463 464 IMPLICIT NONE 465 383 466 !Argument 384 467 REAL(dp), INTENT(IN) :: dd_jd 385 468 TYPE(TDATE), INTENT(IN), OPTIONAL :: td_dateo 469 470 ! function 471 TYPE(TDATE) :: tf_date 386 472 !---------------------------------------------------------------- 387 473 IF( PRESENT(td_dateo) )THEN … … 389 475 390 476 ! pseudo julian day with origin dateo 391 date__init_jd%d_jc=dd_jd392 date__init_jd%k_jcsec=date__jd2sec(dd_jd)477 tf_date%d_jc=dd_jd 478 tf_date%k_jcsec=date__jd2sec(dd_jd) 393 479 394 480 ! convert to truly julian day 395 CALL date__jc2jd( date__init_jd, td_dateo)481 CALL date__jc2jd(tf_date, td_dateo) 396 482 ELSE 397 date__init_jd%d_jd=dd_jd398 date__init_jd%k_jdsec=date__jd2sec(dd_jd)483 tf_date%d_jd=dd_jd 484 tf_date%k_jdsec=date__jd2sec(dd_jd) 399 485 400 486 ! compute CNES julian day 401 CALL date__jd2jc( date__init_jd)487 CALL date__jd2jc(tf_date) 402 488 ENDIF 403 489 404 490 ! check input data 405 CALL date__check( date__init_jd)491 CALL date__check(tf_date) 406 492 407 493 ! compute year month day hour min sec 408 CALL date__jd2ymd( date__init_jd)494 CALL date__jd2ymd(tf_date) 409 495 410 496 ! compute day of the wekk 411 CALL date__jd2dow( date__init_jd)497 CALL date__jd2dow(tf_date) 412 498 413 499 !compute last day of the month 414 date__init_jd%i_lday=date__lastday(date__init_jd)500 tf_date%i_lday=date__lastday(tf_date) 415 501 416 502 END FUNCTION date__init_jd 503 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 504 FUNCTION date__init_nsec(kd_nsec, td_dateo) & 505 & RESULT (tf_date) 417 506 !------------------------------------------------------------------- 418 507 !> @brief This function initialized date structure from number of … … 423 512 !> @author J.Paul 424 513 !> @date November, 2013 - Initial Version 425 ! 514 !> 426 515 !> @param[in] kd_nsec number of second since julian day origin 427 516 !> @param[in] td_dateo new date origin for pseudo julian day 428 ! 517 !> 429 518 !> @return date structure of julian day 430 519 !------------------------------------------------------------------- 431 TYPE(TDATE) FUNCTION date__init_nsec(kd_nsec, td_dateo) 432 IMPLICIT NONE 520 521 IMPLICIT NONE 522 433 523 !Argument 434 524 INTEGER(i8), INTENT(IN) :: kd_nsec 435 525 TYPE(TDATE), INTENT(IN), OPTIONAL :: td_dateo 526 527 ! function 528 TYPE(TDATE) :: tf_date 436 529 !---------------------------------------------------------------- 437 530 IF( PRESENT(td_dateo) )THEN 438 date__init_nsec=date_init( date__sec2jd(kd_nsec), td_dateo )531 tf_date=date_init( date__sec2jd(kd_nsec), td_dateo ) 439 532 ELSE 440 date__init_nsec=date_init( date__sec2jd(kd_nsec) )533 tf_date=date_init( date__sec2jd(kd_nsec) ) 441 534 ENDIF 442 535 443 536 END FUNCTION date__init_nsec 537 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 538 FUNCTION date__init_ymd(id_year, id_month, id_day, & 539 & id_hour, id_min, id_sec, & 540 & td_dateo) & 541 & RESULT (tf_date) 444 542 !------------------------------------------------------------------- 445 543 !> @brief This function initialized date structure form year month day … … 458 556 !> @param[in] id_sec 459 557 !> @param[in] td_dateo new date origin for pseudo julian day 460 ! 558 !> 461 559 !> @return date structure of year month day 462 560 !------------------------------------------------------------------- 463 TYPE(TDATE) FUNCTION date__init_ymd(id_year, id_month, id_day, & 464 & id_hour, id_min, id_sec, & 465 & td_dateo) 466 IMPLICIT NONE 561 562 IMPLICIT NONE 563 467 564 !Argument 468 565 INTEGER(i4), INTENT(IN) :: id_year … … 473 570 INTEGER(i4), INTENT(IN), OPTIONAL :: id_sec 474 571 TYPE(TDATE), INTENT(IN), OPTIONAL :: td_dateo 475 !---------------------------------------------------------------- 476 date__init_ymd%i_year=id_year 477 date__init_ymd%i_month=id_month 478 date__init_ymd%i_day=id_day 572 573 ! function 574 TYPE(TDATE) :: tf_date 575 !---------------------------------------------------------------- 576 tf_date%i_year=id_year 577 tf_date%i_month=id_month 578 tf_date%i_day=id_day 479 579 IF( PRESENT(id_hour) )THEN 480 date__init_ymd%i_hour=id_hour580 tf_date%i_hour=id_hour 481 581 ENDIF 482 582 IF( PRESENT(id_min) )THEN 483 date__init_ymd%i_min=id_min583 tf_date%i_min=id_min 484 584 ENDIF 485 585 IF( PRESENT(id_sec) )THEN 486 date__init_ymd%i_sec=id_sec586 tf_date%i_sec=id_sec 487 587 ENDIF 488 588 ! check input data 489 CALL date__check( date__init_ymd)589 CALL date__check(tf_date) 490 590 491 591 ! compute julian day 492 CALL date__ymd2jd( date__init_ymd)592 CALL date__ymd2jd(tf_date) 493 593 494 594 IF( PRESENT(td_dateo) )THEN 495 595 CALL date__check(td_dateo) 496 596 ! compute julian day with origin dateo 497 CALL date__jd2jc( date__init_ymd, td_dateo)597 CALL date__jd2jc(tf_date, td_dateo) 498 598 ELSE 499 599 ! compute CNES julian day 500 CALL date__jd2jc( date__init_ymd)600 CALL date__jd2jc(tf_date) 501 601 ENDIF 502 602 503 603 ! compute day of the week 504 CALL date__jd2dow( date__init_ymd)604 CALL date__jd2dow(tf_date) 505 605 506 606 !compute last day of the month 507 date__init_ymd%i_lday=date__lastday(date__init_ymd)607 tf_date%i_lday=date__lastday(tf_date) 508 608 509 609 END FUNCTION date__init_ymd 610 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 FUNCTION date__diffdate(td_date1, td_date2) & 612 & RESULT (df_diff) 510 613 !------------------------------------------------------------------- 511 614 !> @brief This function compute number of day between two dates: 512 615 !> nday= date1 - date2 513 ! 514 !> @author J.Paul 515 !> @date November, 2013 - Initial Version 516 ! 616 !> 617 !> @author J.Paul 618 !> @date November, 2013 - Initial Version 619 !> 517 620 !> @param[in] td_date1 first date strutcutre 518 621 !> @param[in] td_date2 second date strutcutre 519 622 !> @return nday 520 623 !------------------------------------------------------------------- 521 REAL(dp) FUNCTION date__diffdate(td_date1, td_date2) 624 522 625 IMPLICIT NONE 523 626 … … 525 628 TYPE(TDATE), INTENT(IN) :: td_date1 526 629 TYPE(TDATE), INTENT(IN) :: td_date2 630 631 ! function 632 REAL(dp) :: df_diff 527 633 !---------------------------------------------------------------- 528 634 … … 531 637 CALL date__check(td_date2) 532 638 533 d ate__diffdate= td_date1%d_jd - td_date2%d_jd639 df_diff = td_date1%d_jd - td_date2%d_jd 534 640 535 641 END FUNCTION date__diffdate 642 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 FUNCTION date__subnday(td_date, dd_nday) & 644 & RESULT (tf_date) 536 645 !------------------------------------------------------------------- 537 646 !> @brief This function substract nday to a date: … … 540 649 !> @author J.Paul 541 650 !> @date November, 2013 - Initial Version 542 ! 651 !> 543 652 !> @param[in] td_date date strutcutre 544 653 !> @param[in] dd_nday number of day 545 654 !> @return date strutcutre of date - nday 546 655 !------------------------------------------------------------------- 547 TYPE(TDATE) FUNCTION date__subnday(td_date, dd_nday) 548 IMPLICIT NONE 549 !Argument 656 657 IMPLICIT NONE 658 659 ! Argument 550 660 TYPE(TDATE), INTENT(IN) :: td_date 551 661 REAL(dp), INTENT(IN) :: dd_nday 662 663 ! function 664 TYPE(TDATE) :: tf_date 552 665 !---------------------------------------------------------------- 553 666 … … 555 668 CALL date__check(td_date) 556 669 557 date__subnday=date__init_jd(td_date%d_jd-dd_nday)670 tf_date=date__init_jd(td_date%d_jd-dd_nday) 558 671 559 672 END FUNCTION date__subnday 673 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 674 FUNCTION date__addnday(td_date, dd_nday) & 675 & RESULT (tf_date) 560 676 !------------------------------------------------------------------- 561 677 !> @brief This function add nday to a date: … … 564 680 !> @author J.Paul 565 681 !> @date November, 2013 - Initial Version 566 ! 682 !> 567 683 !> @param[in] td_date date strutcutre 568 684 !> @param[in] dd_nday number of day 569 685 !> @return date strutcutre of date + nday 570 686 !------------------------------------------------------------------- 571 TYPE(TDATE) FUNCTION date__addnday(td_date, dd_nday) 572 IMPLICIT NONE 573 !Argument 687 688 IMPLICIT NONE 689 690 ! Argument 574 691 TYPE(TDATE), INTENT(IN) :: td_date 575 692 REAL(dp), INTENT(IN) :: dd_nday 693 694 ! function 695 TYPE(TDATE) :: tf_date 576 696 !---------------------------------------------------------------- 577 697 … … 579 699 CALL date__check(td_date) 580 700 581 date__addnday=date__init_jd(td_date%d_jd+dd_nday)701 tf_date=date__init_jd(td_date%d_jd+dd_nday) 582 702 583 703 END FUNCTION date__addnday 704 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 FUNCTION date__lastday(td_date) & 706 & RESULT (if_lday) 584 707 !------------------------------------------------------------------- 585 708 !> @brief This subroutine compute last day of the month 586 ! 587 !> @author J.Paul 588 !> @date November, 2013 - Initial Version 589 ! 709 !> 710 !> @author J.Paul 711 !> @date November, 2013 - Initial Version 712 !> 590 713 !> @param[in] td_date date strutcutre 591 714 !> @return last day of the month 592 715 !------------------------------------------------------------------- 593 INTEGER(i4) FUNCTION date__lastday(td_date) 594 IMPLICIT NONE 716 717 IMPLICIT NONE 718 595 719 ! Argument 596 720 TYPE(TDATE), INTENT(IN) :: td_date 721 722 ! function 723 INTEGER(i4) :: if_lday 597 724 598 725 ! local variable … … 603 730 ! general case 604 731 IF( td_date%i_month /= 2 )THEN 605 date__lastday=il_lastdaytab(td_date%i_month)732 if_lday=il_lastdaytab(td_date%i_month) 606 733 ELSE 607 734 IF( date_leapyear(td_date) )THEN 608 date__lastday=29735 if_lday=29 609 736 ELSE 610 date__lastday=il_lastdaytab(td_date%i_month)737 if_lday=il_lastdaytab(td_date%i_month) 611 738 ENDIF 612 739 ENDIF 613 740 614 741 END FUNCTION date__lastday 742 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 743 SUBROUTINE date__ymd2jd(td_date) 615 744 !------------------------------------------------------------------- 616 745 !> @brief This subroutine compute julian day from year month day , and fill … … 619 748 !> @author J.Paul 620 749 !> @date November, 2013 - Initial Version 621 ! 750 !> 622 751 !> @param[inout] td_date date strutcutre 623 752 !------------------------------------------------------------------- 624 SUBROUTINE date__ymd2jd(td_date) 625 IMPLICIT NONE 753 754 IMPLICIT NONE 755 626 756 ! Argument 627 757 TYPE(TDATE), INTENT(INOUT) :: td_date … … 647 777 648 778 END SUBROUTINE date__ymd2jd 779 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 SUBROUTINE date__jd2ymd(td_date) 649 781 !------------------------------------------------------------------- 650 782 !> @brief This subroutine compute year month day from julian day, and fill … … 653 785 !> @author J.Paul 654 786 !> @date November, 2013 - Initial Version 655 ! 787 !> 656 788 !> @param[inout] td_date date strutcutre 657 789 !------------------------------------------------------------------- 658 SUBROUTINE date__jd2ymd(td_date) 659 IMPLICIT NONE 790 791 IMPLICIT NONE 792 660 793 ! Argument 661 794 TYPE(TDATE), INTENT(INOUT) :: td_date … … 690 823 691 824 END SUBROUTINE date__jd2ymd 825 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 SUBROUTINE date__jc2jd(td_date, td_dateo) 692 827 !------------------------------------------------------------------- 693 828 !> @brief This subroutine compute julian day from pseudo julian day … … 696 831 !> @author J.Paul 697 832 !> @date November, 2013 - Initial Version 698 ! 833 !> 699 834 !> @param[inout] td_date date 700 835 !> @param[in] td_dateo new date origin for pseudo julian day 701 836 !------------------------------------------------------------------- 702 SUBROUTINE date__jc2jd(td_date, td_dateo) 703 IMPLICIT NONE 837 838 IMPLICIT NONE 839 704 840 ! Argument 705 841 TYPE(TDATE), INTENT(INOUT) :: td_date … … 721 857 722 858 END SUBROUTINE date__jc2jd 859 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 SUBROUTINE date__jd2jc(td_date, td_dateo) 723 861 !------------------------------------------------------------------- 724 862 !> @brief This subroutine compute pseudo julian day with new date origin, and … … 728 866 !> @author J.Paul 729 867 !> @date November, 2013 - Initial Version 730 ! 868 !> 731 869 !> @param[inout] td_date date 732 870 !> @param[in] td_dateo new origin date 733 871 !------------------------------------------------------------------- 734 SUBROUTINE date__jd2jc(td_date, td_dateo) 735 IMPLICIT NONE 872 873 IMPLICIT NONE 874 736 875 ! Argument 737 876 TYPE(TDATE), INTENT(INOUT) :: td_date … … 757 896 758 897 END SUBROUTINE date__jd2jc 898 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 SUBROUTINE date__jd2dow(td_date) 759 900 !------------------------------------------------------------------- 760 901 !> @brief This subroutine compute the day of week from julian day, and fill … … 765 906 !> @author J.Paul 766 907 !> @date November, 2013 - Initial Version 767 ! 908 !> 768 909 !> @param[inout] td_date date strutcutre 769 910 !------------------------------------------------------------------- 770 SUBROUTINE date__jd2dow(td_date) 771 IMPLICIT NONE 911 912 IMPLICIT NONE 913 772 914 ! Argument 773 915 TYPE(TDATE), INTENT(INOUT) :: td_date … … 777 919 778 920 END SUBROUTINE date__jd2dow 921 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 FUNCTION date__hms2jd(td_date) & 923 & RESULT (df_frac) 779 924 !------------------------------------------------------------------- 780 925 !> @brief This function compute fraction of a day from … … 783 928 !> @author J.Paul 784 929 !> @date November, 2013 - Initial Version 785 ! 930 !> 786 931 !> @param[in] td_date date strutcutre 787 932 !> @return fraction of the day 788 933 !------------------------------------------------------------------- 789 REAL(dp) FUNCTION date__hms2jd(td_date) 790 IMPLICIT NONE 934 935 IMPLICIT NONE 936 791 937 ! Argument 792 938 TYPE(TDATE), INTENT(IN) :: td_date 939 940 ! function 941 REAL(dp) :: df_frac 793 942 !---------------------------------------------------------------- 794 943 795 944 ! compute real seconds 796 d ate__hms2jd = REAL( td_date%i_sec, dp )945 df_frac = REAL( td_date%i_sec, dp ) 797 946 ! compute real minutes 798 d ate__hms2jd = REAL( td_date%i_min, dp ) + date__hms2jd/60.0947 df_frac = REAL( td_date%i_min, dp ) + df_frac/60.0 799 948 ! compute real hours 800 d ate__hms2jd = REAL( td_date%i_hour, dp ) + date__hms2jd/60.0949 df_frac = REAL( td_date%i_hour, dp ) + df_frac/60.0 801 950 ! julian fraction of a day 802 d ate__hms2jd = date__hms2jd/24.0951 df_frac = df_frac/24.0 803 952 804 953 END FUNCTION date__hms2jd 954 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 SUBROUTINE date__jd2hms(td_date) 805 956 !------------------------------------------------------------------- 806 957 !> @brief This subroutine compute hour, minute, second from julian … … 809 960 !> @author J.Paul 810 961 !> @date November, 2013 - Initial Version 811 ! 962 !> 812 963 !> @param[inout] td_date date strutcutre 813 964 !------------------------------------------------------------------- 814 SUBROUTINE date__jd2hms(td_date) 815 IMPLICIT NONE 965 966 IMPLICIT NONE 967 816 968 ! Argument 817 969 TYPE(TDATE), INTENT(INOUT) :: td_date … … 832 984 833 985 END SUBROUTINE date__jd2hms 986 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 987 SUBROUTINE date__check(td_date) 834 988 !------------------------------------------------------------------- 835 989 !> @brief This subroutine check date express in date structure … … 837 991 !> @author J.Paul 838 992 !> @date November, 2013 - Initial Version 839 ! 993 !> 840 994 !> @param[in] td_date date strutcutre 841 995 !------------------------------------------------------------------- 842 SUBROUTINE date__check(td_date) 843 IMPLICIT NONE 996 997 IMPLICIT NONE 998 844 999 ! Argument 845 1000 TYPE(TDATE), INTENT(IN) :: td_date … … 905 1060 906 1061 END SUBROUTINE date__check 1062 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1063 SUBROUTINE date__adjust(td_date) 907 1064 !------------------------------------------------------------------- 908 1065 !> @brief This subroutine adjust date (correct hour, minutes, and seconds … … 911 1068 !> @author J.Paul 912 1069 !> @date November, 2013 - Initial Version 913 ! 1070 !> 914 1071 !> @param[inout] td_date date strutcutre 915 1072 !------------------------------------------------------------------- 916 SUBROUTINE date__adjust(td_date) 917 IMPLICIT NONE 1073 1074 IMPLICIT NONE 1075 918 1076 ! Argument 919 1077 TYPE(TDATE), INTENT(INOUT) :: td_date … … 936 1094 937 1095 END SUBROUTINE date__adjust 1096 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1097 FUNCTION date__jd2sec(dd_jul) & 1098 & RESULT (if_sec) 938 1099 !------------------------------------------------------------------- 939 1100 !> @brief This function convert julian day in seconds … … 941 1102 !> @author J.Paul 942 1103 !> @date November, 2013 - Initial Version 943 ! 1104 !> 944 1105 !> @param[in] td_date date strutcutre 945 1106 !> @return number of seconds since julian day origin 946 1107 !------------------------------------------------------------------- 947 INTEGER(i8) FUNCTION date__jd2sec(dd_jul) 948 IMPLICIT NONE 1108 1109 IMPLICIT NONE 1110 949 1111 ! Argument 950 1112 REAL(dp), INTENT(IN) :: dd_jul 951 !---------------------------------------------------------------- 952 953 date__jd2sec = NINT( dd_jul * im_secbyday, i8 ) 1113 1114 ! function 1115 INTEGER(i8) :: if_sec 1116 !---------------------------------------------------------------- 1117 1118 if_sec = NINT( dd_jul * im_secbyday, i8 ) 954 1119 955 1120 END FUNCTION date__jd2sec 1121 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 FUNCTION date__sec2jd(kd_nsec) & 1123 & RESULT (df_sec) 956 1124 !------------------------------------------------------------------- 957 1125 !> @brief This function convert seconds since julian day origin in … … 959 1127 !> @author J.Paul 960 1128 !> @date November, 2013 - Initial Version 961 ! 1129 !> 962 1130 !> @param[in] kd_nsec number of second since julian day origin 963 1131 !> @return julian day 964 1132 !------------------------------------------------------------------- 965 REAL(dp) FUNCTION date__sec2jd(kd_nsec) 966 IMPLICIT NONE 1133 1134 IMPLICIT NONE 1135 967 1136 ! Argument 968 1137 INTEGER(i8), INTENT(IN) :: kd_nsec 969 !---------------------------------------------------------------- 970 971 date__sec2jd = REAL( REAL( kd_nsec , dp ) / im_secbyday, dp ) 1138 1139 ! function 1140 REAL(dp) :: df_sec 1141 !---------------------------------------------------------------- 1142 1143 df_sec = REAL( REAL( kd_nsec , dp ) / im_secbyday, dp ) 972 1144 973 1145 END FUNCTION date__sec2jd 1146 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 974 1147 END MODULE date 975 1148
Note: See TracChangeset
for help on using the changeset viewer.