1 /* Apache 2.0 INS-AMU 2015 */
10 int sk_sch_id_init(sk_sch_id_data
*d
, int nx
)
12 SK_MALLOCHECK(d
->f
=malloc(sizeof(double)*nx
));
13 SK_MALLOCHECK(d
->g
=malloc(sizeof(double)*nx
));
14 SK_MALLOCHECK(d
->z
=malloc(sizeof(double)*nx
));
18 void sk_sch_id_free(sk_sch_id_data
*d
)
25 SK_DEFSCH(sk_sch_id
) {
28 /* unused */ (void) dt
;
30 sk_hist_get(hist
, t
, c
); /* Jf Jg Jc */
31 (*sys
)(sysd
, hist
, t
, 0, nx
, x
, d
->f
, d
->g
, NULL
, NULL
, nc
, c
, NULL
);
32 sk_util_fill_gauss(rng
, nx
, d
->z
);
34 x
[i
] = d
->f
[i
] + d
->g
[i
] * d
->z
[i
];
35 sk_hist_set(hist
, t
, c
);
39 int sk_sch_em_init(sk_sch_em_data
*d
, int nx
)
41 SK_MALLOCHECK(d
->f
=malloc(sizeof(double)*nx
));
42 SK_MALLOCHECK(d
->g
=malloc(sizeof(double)*nx
));
43 SK_MALLOCHECK(d
->z
=malloc(sizeof(double)*nx
));
47 void sk_sch_em_free(sk_sch_em_data
*d
)
58 sk_sch_em_data
*d
= data
;
59 sk_hist_get(hist
, t
, c
); /* Jf Jg Jc */
60 (*sys
)(sysd
, hist
, t
, 0, nx
, x
, d
->f
, d
->g
, NULL
, NULL
, nc
, c
, NULL
);
61 sk_util_fill_gauss(rng
, nx
, d
->z
);
64 x
[i
] += dt
* d
->f
[i
] + sqrt_dt
* d
->g
[i
] * d
->z
[i
];
65 sk_hist_set(hist
, t
, c
);
69 int sk_sch_emcolor_init(sk_sch_emcolor_data
*d
, int nx
, double lam
)
71 SK_MALLOCHECK(d
->f
=malloc(sizeof(double)*nx
));
72 SK_MALLOCHECK(d
->g
=malloc(sizeof(double)*nx
));
73 SK_MALLOCHECK(d
->z
=malloc(sizeof(double)*nx
));
74 SK_MALLOCHECK(d
->eps
=malloc(sizeof(double)*nx
));
80 void sk_sch_emcolor_free(sk_sch_emcolor_data
*d
)
88 SK_DEFSCH(sk_sch_emcolor
)
91 double E
; /* not stored so can be chaned while running */
92 sk_sch_emcolor_data
*d
= data
;
94 sk_util_fill_gauss(rng
, nx
, d
->z
); /* Jf Jg Jc */
95 (*sys
)(sysd
, hist
, t
-dt
, 0, nx
, x
, d
->f
, d
->g
, NULL
, NULL
, nc
, c
, NULL
);
97 d
->eps
[i
] = sqrt(d
->g
[i
] * d
->lam
) * d
->z
[i
];
100 E
= exp(-d
->lam
* dt
);
101 sk_util_fill_gauss(rng
, nx
, d
->z
);
102 sk_hist_get(hist
, t
, c
); /* Jf Jg Jc */
103 (*sys
)(sysd
, hist
, t
, 0, nx
, x
, d
->f
, d
->g
, NULL
, NULL
, nc
, c
, NULL
);
104 for (i
=0; i
<nx
; i
++) {
105 x
[i
] += dt
* (d
->f
[i
] + d
->eps
[i
]);
107 d
->eps
[i
] += sqrt(d
->g
[i
] * d
->lam
* (1 - E
*E
)) * d
->z
[i
];
109 sk_hist_set(hist
, t
, c
);
114 int sk_sch_heun_init(sk_sch_heun_data
*d
, int nx
)
116 SK_MALLOCHECK(d
->fl
=malloc(sizeof(double)*nx
));
117 SK_MALLOCHECK(d
->fr
=malloc(sizeof(double)*nx
));
118 SK_MALLOCHECK(d
->gl
=malloc(sizeof(double)*nx
));
119 SK_MALLOCHECK(d
->gr
=malloc(sizeof(double)*nx
));
120 SK_MALLOCHECK(d
->z
=malloc(sizeof(double)*nx
));
121 SK_MALLOCHECK(d
->xr
=malloc(sizeof(double)*nx
));
125 void sk_sch_heun_free(sk_sch_heun_data
*d
)
135 SK_DEFSCH(sk_sch_heun
)
139 sk_sch_heun_data
*d
= data
;
141 sk_hist_get(hist
, t
, c
); /* Jf Jg Jc */
142 (*sys
)(sysd
, hist
, t
, 0, nx
, x
, d
->fl
, d
->gl
, NULL
, NULL
, nc
, c
, NULL
);
144 d
->xr
[i
] = x
[i
] + dt
* d
->fl
[i
];
145 sk_hist_set(hist
, t
, c
);
147 sk_hist_get(hist
, t
+dt
, c
); /* Jf Jg Jc */
148 (*sys
)(sysd
, hist
, t
+dt
, 0, nx
, d
->xr
, d
->fr
, d
->gr
, NULL
, NULL
, nc
, c
, NULL
);
149 sk_util_fill_gauss(rng
, nx
, d
->z
);
152 x
[i
] += 0.5 * (dt
*(d
->fl
[i
] + d
->fr
[i
])
153 + sqrt_dt
*(d
->gl
[i
] + d
->gr
[i
])*d
->z
[i
]);
154 /* TODO double check this has an effect */
155 sk_hist_set(hist
, t
+dt
, c
);