Skip to content

Commit f577f40

Browse files
authored
Merge pull request #195 from hiddenSymmetries/ml/profiles
Radial profiles and bootstrap current
2 parents c5702a4 + 24b5030 commit f577f40

20 files changed

+2912
-21
lines changed

docs/source/optimizable.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,10 @@ also manipulate the fixed/free status of dofs using the functions
184184
>>> c.x
185185

186186
array([ 1. , 0.1, 0. , -2. , 0. , 0.3, 3. , -0.5, 0.4])
187-
187+
188+
189+
.. _dependecies:
190+
188191
Dependencies
189192
------------
190193

docs/source/simsopt.mhd.rst

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ simsopt.mhd package
44
Submodules
55
----------
66

7+
simsopt.mhd.bootstrap module
8+
----------------------------
9+
10+
.. automodule:: simsopt.mhd.bootstrap
11+
:members:
12+
:undoc-members:
13+
:show-inheritance:
14+
715
simsopt.mhd.boozer module
816
-------------------------
917

@@ -12,6 +20,14 @@ simsopt.mhd.boozer module
1220
:undoc-members:
1321
:show-inheritance:
1422

23+
simsopt.mhd.profiles module
24+
---------------------------
25+
26+
.. automodule:: simsopt.mhd.profiles
27+
:members:
28+
:undoc-members:
29+
:show-inheritance:
30+
1531
simsopt.mhd.spec module
1632
-----------------------
1733

src/simsopt/geo/surface.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,3 +604,31 @@ def to_vtk(self, filename, h=0.01):
604604
self.dist.evaluate_batch(RPhiZ, vals)
605605
vals = vals.reshape(R.shape)
606606
gridToVTK(filename, X, Y, Z, pointData={"levelset": vals})
607+
608+
609+
class SurfaceScaled(Optimizable):
610+
"""
611+
Allows you to take any Surface class and scale the dofs. This is
612+
useful for stage-1 optimization.
613+
"""
614+
615+
def __init__(self, surf, scale_factors):
616+
self.surf = surf
617+
self.scale_factors = scale_factors
618+
super().__init__(x0=surf.x / scale_factors, names=surf.local_dof_names)
619+
620+
def recompute_bell(self, parent=None):
621+
self.surf.local_full_x = self.local_full_x * self.scale_factors
622+
623+
def to_RZFourier(self):
624+
return self.surf.to_RZFourier()
625+
626+
def update_fixed(self):
627+
"""
628+
Copy the fixed status from self.surf to self.
629+
"""
630+
for j, is_free in enumerate(self.surf.local_dofs_free_status):
631+
if is_free:
632+
self.unfix(j)
633+
else:
634+
self.fix(j)

src/simsopt/geo/surfacerzfourier.py

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ def __init__(self, nfp=1, stellsym=True, mpol=1, ntor=0,
7676
Surface.__init__(self, x0=self.get_dofs(),
7777
external_dof_setter=SurfaceRZFourier.set_dofs_impl,
7878
names=self._make_names())
79+
self._make_mn()
7980

8081
def get_dofs(self):
8182
"""
@@ -88,11 +89,18 @@ def set_dofs(self, dofs):
8889

8990
def _make_names(self):
9091
"""
91-
Form a list of names of the `rc`, `zs`, `rs`, or `zc` array elements.
92+
Form a list of names of the ``rc``, ``zs``, ``rs``, or ``zc``
93+
array elements. The order of these four arrays here must
94+
match the order in ``set_dofs_impl()`` and ``get_dofs()`` in
95+
``src/simsoptpp/surfacerzfourier.h``.
9296
"""
93-
names = self._make_names_helper('rc', True) + self._make_names_helper('zs', False)
94-
if not self.stellsym:
95-
names += self._make_names_helper('rs', False) + self._make_names_helper('zc', True)
97+
if self.stellsym:
98+
names = self._make_names_helper('rc', True) + self._make_names_helper('zs', False)
99+
else:
100+
names = self._make_names_helper('rc', True) \
101+
+ self._make_names_helper('rs', False) \
102+
+ self._make_names_helper('zc', True) \
103+
+ self._make_names_helper('zs', False)
96104
return names
97105

98106
def _make_names_helper(self, prefix, include0):
@@ -106,6 +114,23 @@ def _make_names_helper(self, prefix, include0):
106114
names += [prefix + '(' + str(m) + ',' + str(n) + ')' for n in range(-self.ntor, self.ntor + 1)]
107115
return names
108116

117+
def _make_mn(self):
118+
"""
119+
Make the list of m and n values.
120+
"""
121+
m1d = np.arange(self.mpol + 1)
122+
n1d = np.arange(-self.ntor, self.ntor + 1)
123+
n2d, m2d = np.meshgrid(n1d, m1d)
124+
m0 = m2d.flatten()[self.ntor:]
125+
n0 = n2d.flatten()[self.ntor:]
126+
m = np.concatenate((m0, m0[1:]))
127+
n = np.concatenate((n0, n0[1:]))
128+
if not self.stellsym:
129+
m = np.concatenate((m, m))
130+
n = np.concatenate((n, n))
131+
self.m = m
132+
self.n = n
133+
109134
@classmethod
110135
def from_wout(cls,
111136
filename: str,
@@ -362,6 +387,7 @@ def change_resolution(self, mpol, ntor):
362387
if not self.stellsym:
363388
self.rs[m, n + ntor] = old_rs[m, n + old_ntor]
364389
self.zc[m, n + ntor] = old_zc[m, n + old_ntor]
390+
self._make_mn()
365391

366392
# Update the dofs object
367393
self._dofs = DOFs(self.get_dofs(), self._make_names())

0 commit comments

Comments
 (0)