Skip to content
Snippets Groups Projects
Commit b571ab64 authored by Luis Kornblueh's avatar Luis Kornblueh
Browse files

Added Fortran test routine, further added C to Fortran interfaces, and changed...

Added Fortran test routine, further added C to Fortran interfaces, and changed calendartoString to calendarToString.
parent 82cf10d1
No related branches found
No related tags found
No related merge requests found
......@@ -27,6 +27,6 @@ calendarType
calendar_type(void);
void
calendartoString(char *calendar);
calendarToString(char *calendar);
#endif
......@@ -11,6 +11,7 @@
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "calendar.h"
......@@ -28,6 +29,8 @@ struct _datetime *
static calendarType _calendar_type = CALENDAR_NOT_SET;
static bool calendar_initialized = false;
/**
* @brief Initialize a new calendar.
*
......@@ -47,31 +50,38 @@ static calendarType _calendar_type = CALENDAR_NOT_SET;
void
init_calendar(calendarType ct)
{
//DO not allow calendar type to be modified. Use a semaphore.
//DO not allow calendar type to be modified.
if (calendar_initialized)
{
ct = _calendar_type;
}
switch (ct)
{
case PROLEPTIC_GREGORIAN:
//Remove all printfs. return a string instead.
printf("Proleptic Gregorian\n");
//printf("Proleptic Gregorian\n");
date2julian = get_julianfromdate;
julian2date = get_datefromjulian;
_calendar_type = PROLEPTIC_GREGORIAN;
calendar_initialized = true;
break;
case YEAR_OF_365_DAYS:
printf("Year of 365 days\n");
//printf("Year of 365 days\n");
date2julian = get_julianfromdate365;
julian2date = get_date365fromjulian;
_calendar_type = YEAR_OF_365_DAYS;
calendar_initialized = true;
break;
case YEAR_OF_360_DAYS:
printf("Year of 360 days\n");
//printf("Year of 360 days\n");
date2julian = get_julianfromdate360;
julian2date = get_date360fromjulian;
_calendar_type = YEAR_OF_360_DAYS;
calendar_initialized = true;
break;
case CALENDAR_NOT_SET:
default:
fprintf(stderr, "Not defined\n");
//fprintf(stderr, "Not defined\n");
break;
}
......@@ -92,7 +102,7 @@ calendar_type(void)
* Get a string describing the calendar in use.
*/
void
calendartoString(char *calendar)
calendarToString(char *calendar)
{
switch (_calendar_type)
{
......@@ -121,6 +131,6 @@ void
free_calendar(void)
{
_calendar_type = CALENDAR_NOT_SET;
calendar_initialized = false;
return;
}
MODULE libmtime
module libmtime
USE, INTRINSIC :: iso_c_binding, ONLY: c_int, c_int64_t, c_ptr, c_char, c_bool
use, intrinsic :: iso_c_binding, only: c_int, c_int64_t, c_ptr, c_char, c_bool, c_null_char, &
& c_f_pointer, c_loc
IMPLICIT NONE
implicit none
ENUM, BIND(C)
ENUMERATOR :: CALENDAR_NOT_SET = 0
ENUMERATOR :: PROLEPTIC_GREGORIAN = 1
ENUMERATOR :: YEAR_OF_365_DAYS = 2
ENUMERATOR :: YEAR_OF_360_DAYS = 3
END ENUM
integer, parameter :: max_calendar_str_len = 32
integer, parameter :: max_time_str_len = 32
integer, parameter :: max_date_str_len = 32
integer, parameter :: max_datetime_str_len = 32
integer, parameter :: max_timedelta_str_len = 32
integer, parameter :: max_julianday_str_len = 32
integer, parameter :: max_eventname_str_len = 132
integer, parameter :: max_groupname_str_len = 132
enum, bind(c)
enumerator :: calendar_not_set = 0
enumerator :: proleptic_gregorian = 1
enumerator :: year_of_365_days = 2
enumerator :: year_of_360_days = 3
end enum
ENUM, BIND(C)
ENUMERATOR :: FAILURE = 0
ENUMERATOR :: DATETIME_MATCH = 1
ENUMERATOR :: DURATION_MATCH = 2
END ENUM
enum, bind(c)
enumerator :: failure = 0
enumerator :: datetime_match = 1
enumerator :: duration_match = 2
end enum
type, bind(c) :: date
integer(c_int64_t) :: year
integer(c_int) :: month
integer(c_int) :: day
end type date
TYPE, BIND(C) :: date
INTEGER(c_int64_t) :: year
INTEGER(c_int) :: month
INTEGER(c_int) :: day
END TYPE date
type, bind(c) :: time
integer(c_int) :: hour
integer(c_int) :: minute
integer(c_int) :: second
integer(c_int) :: ms
end type time
TYPE, BIND(C) :: time
INTEGER(c_int) :: hour
INTEGER(c_int) :: minute
INTEGER(c_int) :: second
INTEGER(c_int) :: ms
END TYPE time
type, bind(c) :: datetime
type(date) :: date
type(time) :: time
end type datetime
TYPE, BIND(C) :: datetime
TYPE(date) :: date
TYPE(time) :: time
END type datetime
type, bind(c) :: timedelta
character(c_char) :: sign
integer(c_int64_t) :: year
integer(c_int) :: month
integer(c_int) :: day
integer(c_int) :: hour
integer(c_int) :: minute
integer(c_int) :: second
integer(c_int) :: ms
end type timedelta
TYPE, BIND(C) :: timedelta
CHARACTER(c_char) :: sign
INTEGER(c_int64_t) :: year
INTEGER(c_int) :: month
INTEGER(c_int) :: day
INTEGER(c_int) :: hour
INTEGER(c_int) :: minute
INTEGER(c_int) :: second
INTEGER(c_int) :: ms
END type timedelta
type, bind(c) :: juliandelta
character(c_char) :: sign
integer(c_int64_t) :: year
integer(c_int64_t) :: ms
end type juliandelta
TYPE, BIND(C) :: juliandelta
CHARACTER(c_char) :: sign
INTEGER(c_int64_t) :: year
INTEGER(c_int64_t) :: ms
END type juliandelta
type, bind(c) :: eventgroup
integer(c_int64_t) :: eventgroupid
type(c_ptr) :: eventgroupname
type(c_ptr) :: eventlist
end type eventgroup
TYPE, BIND(C) :: eventGroup
INTEGER(c_int64_t) :: eventGroupId
TYPE(c_ptr) :: eventGroupName
TYPE(c_ptr) :: eventList
END TYPE eventGroup
type, bind(c) :: event
type(c_ptr) :: eventname
integer(c_int64_t) :: eventid
TYPE, BIND(c) :: event
TYPE(c_ptr) :: eventName
INTEGER(c_int64_t) :: eventId
type(c_ptr) :: eventreferencedatetime
type(c_ptr) :: eventfirstdatetime
type(c_ptr) :: eventlastdatetime
TYPE(c_ptr) :: eventReferenceDateTime
TYPE(c_ptr) :: eventFirstDateTime
TYPE(c_ptr) :: eventLastDateTime
type(c_ptr) :: eventinterval
TYPE(c_ptr) :: eventInterval
logical(c_bool) :: triggercurrentevent
LOGICAL(c_bool) :: triggerCurrentEvent
type(c_ptr) :: triggernexteventdatetime
type(c_ptr) :: triggeredpreviouseventdatetime
end type event
TYPE(c_ptr) :: triggerNextEventDateTime
TYPE(c_ptr) :: triggeredPreviousEventDateTime
END type event
INTERFACE
!_____________________________________________________________________________________________
!_____________________________________________________________________________________________
interface
! calendar routines:
!
! void init_calendar(calendarType ct);
SUBROUTINE init_calendar(ct) BIND(c)
IMPORT :: c_int
INTEGER(c_int), VALUE :: ct
END SUBROUTINE init_calendar
subroutine init_calendar(ct) bind(c, name='init_calendar')
import :: c_int
integer(c_int), value :: ct
end subroutine init_calendar
!
subroutine free_calendar() bind(c, name='free_calendar')
end subroutine free_calendar
!
! void free_calendar(void);
SUBROUTINE free_calendar() BIND(c)
END SUBROUTINE free_calendar
function calendar_type() bind(c, name='calendar_type')
import :: c_int
integer(c_int) :: calendar_type
end function calendar_type
!
! calendarType calendar_type(void);
FUNCTION calendar_type() BIND(c)
IMPORT :: c_int
INTEGER(c_int) :: calendar_type
END FUNCTION calendar_type
subroutine my_calendartostring(calendar) bind(c, name='calendarToString')
import :: c_char
character(c_char), dimension(*) :: calendar
end subroutine my_calendartostring
!
! void calendartoString(char *calendar);
SUBROUTINE calendartoString(calendar) BIND(c)
IMPORT :: c_char
CHARACTER(c_char), DIMENSION(*) :: calendar
END SUBROUTINE calendartoString
!_____________________________________________________________________________________________
end interface
!_____________________________________________________________________________________________
interface
! date routines:
!
! void deallocateDate(struct _date* d);
SUBROUTINE deallocateDate(d) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: d
END SUBROUTINE deallocateDate
function my_newdate(string) result(c_pointer) bind(c, name='newDate')
import :: c_char, c_ptr
type(c_ptr) :: c_pointer
character(c_char), dimension(*) :: string
end function
!
! void deallocatedate(struct _date* d);
subroutine deallocatedate(d) bind(c)
import :: c_ptr
type(c_ptr), value :: d
end subroutine deallocatedate
!
! char* datetostring(struct _date*, char*);
function my_datetostring(my_date, string) result(string_ptr) bind(c, name='dateToString')
import :: c_ptr, c_char
type(c_ptr) :: string_ptr
type(c_ptr) :: my_date
character(c_char), dimension(*) :: string
end function my_datetostring
!
! char* dateToString(struct _date*, char*);
FUNCTION dateToString() BIND(c)
IMPORT :: c_ptr, c_char
TYPE(c_ptr) :: dateToString
END FUNCTION dateToString
!_____________________________________________________________________________________________
end interface
!_____________________________________________________________________________________________
interface
! datetime routines:
!
! void deallocateDateTime(struct _datetime* dt);
SUBROUTINE deallocateDateTime(dt) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: dt
END SUBROUTINE deallocateDateTime
! void deallocatedatetime(struct _datetime* dt);
subroutine deallocatedatetime(dt) bind(c)
import :: c_ptr
type(c_ptr), value :: dt
end subroutine deallocatedatetime
!
! char* datetimeToString(struct _datetime* dt, char* toStr);
FUNCTION datetimeToString(dt, toStr) BIND(c)
IMPORT :: c_ptr, c_char
TYPE(c_ptr) :: datetimeToString
TYPE(c_ptr), VALUE :: dt
CHARACTER(c_char), DIMENSION(*) :: toStr
END FUNCTION datetimeToString
! char* datetimetostring(struct _datetime* dt, char* tostr);
function datetimetostring(dt, tostr) bind(c)
import :: c_ptr, c_char
type(c_ptr) :: datetimetostring
type(c_ptr), value :: dt
character(c_char), dimension(*) :: tostr
end function datetimetostring
!
! int getNoOfDaysInMonthDateTime(struct _datetime* dt);
FUNCTION getNoOfDaysInMonthDateTime(dt) BIND(c)
IMPORT :: c_int, c_ptr
INTEGER(c_int) :: getNoOfDaysInMonthDateTime
TYPE(c_ptr), VALUE :: dt
END FUNCTION getNoOfDaysInMonthDateTime
! int getnoofdaysinmonthdatetime(struct _datetime* dt);
function getnoofdaysinmonthdatetime(dt) bind(c)
import :: c_int, c_ptr
integer(c_int) :: getnoofdaysinmonthdatetime
type(c_ptr), value :: dt
end function getnoofdaysinmonthdatetime
!
! int getNoOfDaysInYearDateTime(struct _datetime* dt);
FUNCTION getNoOfDaysInYearDateTime(dt) BIND(c)
IMPORT :: c_int, c_ptr
INTEGER(c_int) :: getNoOfDaysInYearDateTime
TYPE(c_ptr), VALUE :: dt
END FUNCTION getNoOfDaysInYearDateTime
! int getnoofdaysinyeardatetime(struct _datetime* dt);
function getnoofdaysinyeardatetime(dt) bind(c)
import :: c_int, c_ptr
integer(c_int) :: getnoofdaysinyeardatetime
type(c_ptr), value :: dt
end function getnoofdaysinyeardatetime
!
! int getDayOfYearFromDateTime(struct _datetime* currentdt);
FUNCTION getDayOfYearFromDateTime(currentdt) BIND(c)
IMPORT :: c_int, c_ptr
INTEGER(c_int) :: getDayOfYearFromDateTime
TYPE(c_ptr), VALUE :: currentdt
END FUNCTION getDayOfYearFromDateTime
!_____________________________________________________________________________________________
! int getdayofyearfromdatetime(struct _datetime* currentdt);
function getdayofyearfromdatetime(currentdt) bind(c)
import :: c_int, c_ptr
integer(c_int) :: getdayofyearfromdatetime
type(c_ptr), value :: currentdt
end function getdayofyearfromdatetime
end interface
!_____________________________________________________________________________________________
interface
! event group routines:
!
! void deallocateEventGroup(struct _eventGroup* eventGroup);
SUBROUTINE deallocateEventGroup(eventGroup) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: eventGroup
END SUBROUTINE deallocateEventGroup
! void deallocateeventgroup(struct _eventgroup* eventgroup);
subroutine deallocateeventgroup(eventgroup) bind(c)
import :: c_ptr
type(c_ptr), value :: eventgroup
end subroutine deallocateeventgroup
!
! void deallocateEvent(struct _event* event);
SUBROUTINE deallocateEvent(event) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: event
END SUBROUTINE deallocateEvent
! void deallocateevent(struct _event* event);
subroutine deallocateevent(event) bind(c)
import :: c_ptr
type(c_ptr), value :: event
end subroutine deallocateevent
!
! void setEvent(struct _event* event);
SUBROUTINE setEvent(event) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: event
END SUBROUTINE setEvent
! void setevent(struct _event* event);
subroutine setevent(event) bind(c)
import :: c_ptr
type(c_ptr), value :: event
end subroutine setevent
!
! char* eventToString(struct _event* event, char* string);
FUNCTION eventToString(event, string) BIND(c)
IMPORT :: c_ptr, c_char
TYPE(c_ptr) :: eventToString
TYPE(c_ptr), VALUE :: event
CHARACTER(c_char), DIMENSION(*) :: string
END FUNCTION eventToString
! char* eventtostring(struct _event* event, char* string);
function eventtostring(event, string) bind(c)
import :: c_ptr, c_char
type(c_ptr) :: eventtostring
type(c_ptr), value :: event
character(c_char), dimension(*) :: string
end function eventtostring
!
! void deallocateEventList(struct _eventList* list);
SUBROUTINE deallocateEventList(list) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: list
END SUBROUTINE deallocateEventList
! void deallocateeventlist(struct _eventlist* list);
subroutine deallocateeventlist(list) bind(c)
import :: c_ptr
type(c_ptr), value :: list
end subroutine deallocateeventlist
!
! void deallocateNode(struct _node* node);
SUBROUTINE deallocateNode(node) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: node
END SUBROUTINE deallocateNode
! void deallocatenode(struct _node* node);
subroutine deallocatenode(node) bind(c)
import :: c_ptr
type(c_ptr), value :: node
end subroutine deallocatenode
!
! void deallocate_iso8601_datetime(struct iso8601_datetime* iso8601_datetime);
SUBROUTINE deallocate_iso8601_datetime(iso8601_datetime) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: iso8601_datetime
END SUBROUTINE deallocate_iso8601_datetime
subroutine deallocate_iso8601_datetime(iso8601_datetime) bind(c)
import :: c_ptr
type(c_ptr), value :: iso8601_datetime
end subroutine deallocate_iso8601_datetime
!
! void deallocate_iso8601_duration(struct iso8601_duration* iso8601_duration);
SUBROUTINE deallocate_iso8601_duration(iso8601_duration) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: iso8601_duration
END SUBROUTINE deallocate_iso8601_duration
subroutine deallocate_iso8601_duration(iso8601_duration) bind(c)
import :: c_ptr
type(c_ptr), value :: iso8601_duration
end subroutine deallocate_iso8601_duration
! STATUS verify_string_datetime(const char* test_string, struct iso8601_datetime* dummy_isoDt);
FUNCTION verify_string_datetime(test_string, dummy_isoDt) BIND(c)
IMPORT :: c_int, c_char, c_ptr
INTEGER(c_int) :: verify_string_datetime
CHARACTER(c_char), DIMENSION(*) :: test_string
TYPE(c_ptr), VALUE :: dummy_isoDt
END FUNCTION verify_string_datetime
! status verify_string_datetime(const char* test_string, struct iso8601_datetime* dummy_isodt);
function verify_string_datetime(test_string, dummy_isodt) bind(c)
import :: c_int, c_char, c_ptr
integer(c_int) :: verify_string_datetime
character(c_char), dimension(*) :: test_string
type(c_ptr), value :: dummy_isodt
end function verify_string_datetime
! STATUS verify_string_duration(const char* test_string, struct iso8601_duration* dummy_isoD);
FUNCTION verify_string_duration(test_string, dummy_isoD) BIND(c)
IMPORT :: c_int, c_char, c_ptr
INTEGER(c_int) :: verify_string_duration
CHARACTER(c_char), DIMENSION(*) :: test_string
TYPE(c_ptr), VALUE :: dummy_isoD
END FUNCTION verify_string_duration
! status verify_string_duration(const char* test_string, struct iso8601_duration* dummy_isod);
function verify_string_duration(test_string, dummy_isod) bind(c)
import :: c_int, c_char, c_ptr
integer(c_int) :: verify_string_duration
character(c_char), dimension(*) :: test_string
type(c_ptr), value :: dummy_isod
end function verify_string_duration
! void deallocateJulianDay(struct _julianday* jd);
SUBROUTINE deallocateJulianDay(jd) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: jd
END SUBROUTINE deallocateJulianDay
! void deallocatejulianday(struct _julianday* jd);
subroutine deallocatejulianday(jd) bind(c)
import :: c_ptr
type(c_ptr), value :: jd
end subroutine deallocatejulianday
! void deallocateJulianDelta(struct _juliandelta* jd);
SUBROUTINE deallocateJulianDelta(jd) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: jd
END SUBROUTINE deallocateJulianDelta
! void deallocatejuliandelta(struct _juliandelta* jd);
subroutine deallocatejuliandelta(jd) bind(c)
import :: c_ptr
type(c_ptr), value :: jd
end subroutine deallocatejuliandelta
! void deallocateTime(struct _time* t);
SUBROUTINE deallocateTime(t) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: t
END SUBROUTINE deallocateTime
! void deallocatetime(struct _time* t);
subroutine deallocatetime(t) bind(c)
import :: c_ptr
type(c_ptr), value :: t
end subroutine deallocatetime
! char* timeToString(struct _time*, char*);
FUNCTION timeToString() BIND(c)
IMPORT :: c_ptr, c_char
TYPE(c_ptr) :: timeToString
END FUNCTION timeToString
! char* timetostring(struct _time*, char*);
function timetostring() bind(c)
import :: c_ptr, c_char
type(c_ptr) :: timetostring
end function timetostring
! void deallocateTimeDelta(struct _timedelta* td);
SUBROUTINE deallocateTimeDelta(td) BIND(c)
IMPORT :: c_ptr
TYPE(c_ptr), VALUE :: td
END SUBROUTINE deallocateTimeDelta
! void deallocatetimedelta(struct _timedelta* td);
subroutine deallocatetimedelta(td) bind(c)
import :: c_ptr
type(c_ptr), value :: td
end subroutine deallocatetimedelta
! char* timedeltatoString(struct _timedelta * td, char *toString);
FUNCTION timedeltatoString(td, toString) BIND(c)
IMPORT :: c_ptr, c_char
TYPE(c_ptr) :: timedeltatoString
TYPE(c_ptr), VALUE :: td
CHARACTER(c_char), DIMENSION(*) :: toString
END FUNCTION timedeltatoString
! char* timedeltatostring(struct _timedelta * td, char *tostring);
function timedeltatostring(td, tostring) bind(c)
import :: c_ptr, c_char
type(c_ptr) :: timedeltatostring
type(c_ptr), value :: td
character(c_char), dimension(*) :: tostring
end function timedeltatostring
END INTERFACE
end interface
END MODULE libmtime
contains
!
subroutine calendartostring(string)
character(len=max_calendar_str_len), intent(out) :: string
integer :: i
call my_calendartostring(string)
char_loop: do i = 1 , len(string)
if (string(i:i) == c_null_char) exit char_loop
end do char_loop
string(i:len(string)) = ' '
end subroutine calendartostring
!
function newdate(string) result(ret_date)
type(date), pointer :: ret_date
character(len=*), intent(in) :: string
type(c_ptr) :: c_pointer
c_pointer = my_newdate(trim(string)//c_null_char)
call c_f_pointer(c_pointer, ret_date)
print *, ret_date%year, ret_date%month, ret_date%day
end function newdate
!
subroutine datetostring(my_date, string)
type(date), pointer :: my_date
character(len=max_date_str_len), intent(out) :: string
type(c_ptr) :: dummy_ptr
integer :: i
print *, my_date%year, my_date%month, my_date%day
dummy_ptr = my_datetostring(c_loc(my_date), string//c_null_char)
char_loop: do i = 1 , len(string)
if (string(i:i) == c_null_char) exit char_loop
end do char_loop
string(i:len(string)) = ' '
end subroutine datetostring
!
end module libmtime
AM_CPPFLAGS = -I$(top_srcdir)/include
AM_FCFLAGS = -I$(top_srcdir)/src
bin_PROGRAMS = time_calculus model_integration
bin_PROGRAMS = time_calculus model_integration example
time_calculus_SOURCES = time_calculus.c
time_calculus_LDADD = $(top_srcdir)/src/libmtime.la
......@@ -9,3 +10,7 @@ time_calculus_LDFLAGS=
model_integration_SOURCES = model_integration.c
model_integration_LDADD = $(top_srcdir)/src/libmtime.la
model_integration_LDFLAGS=
example_SOURCES = example.f90
example_LDADD = $(top_srcdir)/src/libmtime.la
example_LDFLAGS=
program example
use libmtime
implicit none
character(len=max_calendar_str_len) :: calendar_in_use
character(len=max_date_str_len) :: start_date_string
type(date), pointer :: start_date != newDateTime('2012-09-01T02:10:00.000')
! type(datetime) :: stop_date = newDateTime('2012-09-10T14:00:00.000');
! type(datetime) :: model_time = newDateTime('2012-09-01T00:00:00.000');
call init_calendar(proleptic_gregorian)
call calendarToString(calendar_in_use)
print *, 'string: >', TRIM(calendar_in_use), '< int: ', calendar_type(), ' (expect 1)'
start_date => newDate('2012-09-01')
call dateToString(start_date, start_date_string)
! printf("Model time step: %s\n", timedeltatoString(timestep, current_step));
! printf("Model start time: %s\n", datetimeToString(model_time, current_time));
! time_integration: do
! printf("Model time: %s\n", datetimeToString(model_time, current_time));
! update_time = addTimeDeltaToDateTime(model_time, timestep, update_time);
! model_time = replaceDatetime(update_time, model_time);
! if (compareDatetime(model_time, stop_date) <= 0) exit time_integration
! enddo time_integration
! printf("Model stop time: %s\n", datetimeToString(model_time, current_time));
call free_calendar()
end program example
......@@ -19,7 +19,7 @@ main(int argc, char *argv[])
init_calendar(YEAR_OF_360_DAYS);
char calendar_in_use[MAX_CALENDAR_STR_LEN];
calendartoString(calendar_in_use);
calendarToString(calendar_in_use);
printf("Calendar in use: %s\n", calendar_in_use);
//init_calendar(YEAR_OF_365_DAYS);
// time step : 720 s (12 minutes)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment