-
Notifications
You must be signed in to change notification settings - Fork 613
/
update_pols.cpp
60 lines (48 loc) · 1.73 KB
/
update_pols.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* Copyright (C) 2005-2020 Massachusetts Institute of Technology
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2, or (at your option)
% any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software Foundation,
% Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <stdio.h>
#include <math.h>
#include <string.h>
#include "meep.hpp"
#include "meep_internals.hpp"
#include "config.h"
using namespace std;
namespace meep {
void fields::update_pols(field_type ft) {
for (int i = 0; i < num_chunks; i++)
if (chunks[i]->is_mine())
if (chunks[i]->update_pols(ft)) chunk_connections_valid = false;
}
bool fields_chunk::update_pols(field_type ft) {
bool allocated_fields = false;
realnum *w[NUM_FIELD_COMPONENTS][2];
FOR_COMPONENTS(c) DOCMP2 { w[c][cmp] = f_w[c][cmp] ? f_w[c][cmp] : f[c][cmp]; }
for (polarization_state *p = pol[ft]; p; p = p->next) {
// Lazily allocate internal polarization data:
if (!p->data) {
p->data = p->s->new_internal_data(f, gv);
if (p->data) {
p->s->init_internal_data(f, dt, gv, p->data);
allocated_fields = true;
}
}
// Finally, timestep the polarizations:
p->s->update_P(w, f_w_prev, dt, gv, p->data);
}
return allocated_fields;
}
} // namespace meep