femagtools 1.8.3__py3-none-any.whl → 1.8.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- femagtools/__init__.py +1 -1
- femagtools/bch.py +10 -6
- femagtools/dxfsl/area.py +4 -1
- femagtools/dxfsl/conv.py +49 -17
- femagtools/dxfsl/converter.py +239 -75
- femagtools/dxfsl/fslrenderer.py +18 -22
- femagtools/dxfsl/functions.py +24 -2
- femagtools/dxfsl/geom.py +100 -23
- femagtools/dxfsl/machine.py +44 -7
- femagtools/dxfsl/shape.py +4 -0
- femagtools/dxfsl/symmetry.py +78 -25
- femagtools/fsl.py +0 -1
- femagtools/machine/afpm.py +2 -2
- femagtools/machine/effloss.py +2 -2
- femagtools/machine/im.py +6 -8
- femagtools/machine/sm.py +2 -2
- femagtools/mcv.py +10 -11
- femagtools/templates/mesh-airgap.mako +6 -0
- femagtools/utils.py +1 -1
- femagtools/windings.py +11 -4
- {femagtools-1.8.3.dist-info → femagtools-1.8.4.dist-info}/METADATA +1 -1
- {femagtools-1.8.3.dist-info → femagtools-1.8.4.dist-info}/RECORD +27 -27
- tests/test_parident.py +2 -1
- {femagtools-1.8.3.dist-info → femagtools-1.8.4.dist-info}/LICENSE +0 -0
- {femagtools-1.8.3.dist-info → femagtools-1.8.4.dist-info}/WHEEL +0 -0
- {femagtools-1.8.3.dist-info → femagtools-1.8.4.dist-info}/entry_points.txt +0 -0
- {femagtools-1.8.3.dist-info → femagtools-1.8.4.dist-info}/top_level.txt +0 -0
    
        femagtools/dxfsl/converter.py
    CHANGED
    
    | @@ -10,20 +10,22 @@ from femagtools.dxfsl.shape import Shape | |
| 10 10 | 
             
            from femagtools.dxfsl.fslrenderer import FslRenderer, agndst
         | 
| 11 11 | 
             
            from femagtools.dxfsl.plotrenderer import PlotRenderer
         | 
| 12 12 | 
             
            from femagtools.dxfsl.concat import Concatenation
         | 
| 13 | 
            -
            from femagtools.dxfsl.functions import Timer, middle_angle
         | 
| 13 | 
            +
            from femagtools.dxfsl.functions import Timer, SimpleProcess, middle_angle
         | 
| 14 14 | 
             
            from femagtools.dxfsl.journal import Journal, getJournal
         | 
| 15 15 | 
             
            from femagtools.dxfsl.area import TYPE_WINDINGS
         | 
| 16 | 
            +
            from femagtools.dxfsl.areabuilder import disable_logging, enable_logging
         | 
| 16 17 | 
             
            import logging
         | 
| 17 18 | 
             
            import logging.config
         | 
| 18 19 | 
             
            import numpy as np
         | 
| 19 20 | 
             
            import sys
         | 
| 21 | 
            +
            import multiprocessing
         | 
| 20 22 |  | 
| 21 23 | 
             
            logger = logging.getLogger(__name__)
         | 
| 22 24 | 
             
            journal = None
         | 
| 23 25 |  | 
| 24 26 |  | 
| 25 27 | 
             
            def plot_geom(doit, plt, geom, title="Plot", areas=True):
         | 
| 26 | 
            -
                if not doit:
         | 
| 28 | 
            +
                if not doit or not plt:
         | 
| 27 29 | 
             
                    return
         | 
| 28 30 |  | 
| 29 31 | 
             
                logger.info("Prepare Plot %s", title)
         | 
| @@ -42,9 +44,121 @@ def plot_geom(doit, plt, geom, title="Plot", areas=True): | |
| 42 44 | 
             
                                    fill_areas=areas)
         | 
| 43 45 |  | 
| 44 46 |  | 
| 47 | 
            +
            class SymSearchProcess(SimpleProcess):
         | 
| 48 | 
            +
                def __init__(self,
         | 
| 49 | 
            +
                             name=None,
         | 
| 50 | 
            +
                             queue=None,
         | 
| 51 | 
            +
                             machine=None,
         | 
| 52 | 
            +
                             plt=None,  # plotter
         | 
| 53 | 
            +
                             kind="",
         | 
| 54 | 
            +
                             mindist=0.01,
         | 
| 55 | 
            +
                             symtol=0.0,
         | 
| 56 | 
            +
                             sympart=0,
         | 
| 57 | 
            +
                             is_inner=False,
         | 
| 58 | 
            +
                             is_outer=False,
         | 
| 59 | 
            +
                             show_plots=True,
         | 
| 60 | 
            +
                             debug_mode=False,
         | 
| 61 | 
            +
                             rows=1,
         | 
| 62 | 
            +
                             cols=1,
         | 
| 63 | 
            +
                             num=1,
         | 
| 64 | 
            +
                             no_processing=False):
         | 
| 65 | 
            +
                    SimpleProcess.__init__(self,
         | 
| 66 | 
            +
                                           name=name,
         | 
| 67 | 
            +
                                           no_processing=no_processing)
         | 
| 68 | 
            +
                    self.queue = queue
         | 
| 69 | 
            +
                    self.mach_in = machine
         | 
| 70 | 
            +
                    self.mach_out = None
         | 
| 71 | 
            +
                    self.plt = plt
         | 
| 72 | 
            +
                    self.kind = kind
         | 
| 73 | 
            +
                    self.mindist = mindist
         | 
| 74 | 
            +
                    self.symtol = symtol
         | 
| 75 | 
            +
                    self.sympart = sympart
         | 
| 76 | 
            +
                    self.is_inner = is_inner
         | 
| 77 | 
            +
                    self.is_outer = is_outer
         | 
| 78 | 
            +
                    self.show_plots = show_plots
         | 
| 79 | 
            +
                    self.debug_mode = debug_mode
         | 
| 80 | 
            +
                    self.rows = rows
         | 
| 81 | 
            +
                    self.cols = cols
         | 
| 82 | 
            +
                    self.num = num
         | 
| 83 | 
            +
                    pass
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                def run(self):
         | 
| 86 | 
            +
                    if not self.without_processing():
         | 
| 87 | 
            +
                        logger.info("Process is running")
         | 
| 88 | 
            +
                        self.plt = None
         | 
| 89 | 
            +
                        self.show_plots = False
         | 
| 90 | 
            +
                    else:
         | 
| 91 | 
            +
                        logger.info("without multiprocessing")
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                    try:
         | 
| 94 | 
            +
                        self.mach_out = symmetry_search(
         | 
| 95 | 
            +
                            self.mach_in,
         | 
| 96 | 
            +
                            plt=self.plt,
         | 
| 97 | 
            +
                            kind=self.kind,
         | 
| 98 | 
            +
                            mindist=self.mindist,
         | 
| 99 | 
            +
                            symtol=self.symtol,
         | 
| 100 | 
            +
                            sympart=self.sympart,
         | 
| 101 | 
            +
                            is_inner=self.is_inner,
         | 
| 102 | 
            +
                            is_outer=self.is_outer,
         | 
| 103 | 
            +
                            show_plots=self.show_plots,
         | 
| 104 | 
            +
                            debug_mode=self.debug_mode,
         | 
| 105 | 
            +
                            rows=self.rows,
         | 
| 106 | 
            +
                            cols=self.cols,
         | 
| 107 | 
            +
                            num=self.num)
         | 
| 108 | 
            +
                    except Exception as e:
         | 
| 109 | 
            +
                        logger.warning("Exception in symmetry_search: %s", e)
         | 
| 110 | 
            +
                    if not self.mach_out:
         | 
| 111 | 
            +
                        logger.error("NO MACHINE AFTER PROCESS")
         | 
| 112 | 
            +
                    self.queue.put(self.mach_out)
         | 
| 113 | 
            +
                    if not self.without_processing():
         | 
| 114 | 
            +
                        logger.info("Process is finished")
         | 
| 115 | 
            +
             | 
| 116 | 
            +
             | 
| 117 | 
            +
            class BuildInnerProcess(SimpleProcess):
         | 
| 118 | 
            +
                def __init__(self,
         | 
| 119 | 
            +
                             name=None,
         | 
| 120 | 
            +
                             queue=None,
         | 
| 121 | 
            +
                             machine=None,
         | 
| 122 | 
            +
                             mindist=0.01,
         | 
| 123 | 
            +
                             plt=None,  # plotter
         | 
| 124 | 
            +
                             EESM=False,
         | 
| 125 | 
            +
                             no_processing=False):
         | 
| 126 | 
            +
                    SimpleProcess.__init__(self,
         | 
| 127 | 
            +
                                           name=name,
         | 
| 128 | 
            +
                                           no_processing=no_processing)
         | 
| 129 | 
            +
                    self.queue = queue
         | 
| 130 | 
            +
                    self.mach_in = machine
         | 
| 131 | 
            +
                    self.mach_out = None
         | 
| 132 | 
            +
                    self.plt = plt
         | 
| 133 | 
            +
                    self.mindist = mindist
         | 
| 134 | 
            +
                    self.EESM = EESM
         | 
| 135 | 
            +
                    pass
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                def run(self):
         | 
| 138 | 
            +
                    if not self.without_processing():
         | 
| 139 | 
            +
                        logger.info("Process is running")
         | 
| 140 | 
            +
                        self.plt = None
         | 
| 141 | 
            +
                    else:
         | 
| 142 | 
            +
                        logger.info("without multiprocessing")
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                    try:
         | 
| 145 | 
            +
                        self.mach_out = build_inner_machine(
         | 
| 146 | 
            +
                            self.mach_in,
         | 
| 147 | 
            +
                            mindist=self.mindist,
         | 
| 148 | 
            +
                            plt=self.plt,
         | 
| 149 | 
            +
                            EESM=self.EESM)
         | 
| 150 | 
            +
                    except Exception as e:
         | 
| 151 | 
            +
                        logger.warning("Exception in symmetry_search: %s", e)
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                    self.queue.put(self.mach_out)
         | 
| 154 | 
            +
                    if not self.without_processing():
         | 
| 155 | 
            +
                        logger.info("Process is finished")
         | 
| 156 | 
            +
             | 
| 157 | 
            +
             | 
| 45 158 | 
             
            def symmetry_search(machine,
         | 
| 46 | 
            -
                                plt,  # plotter
         | 
| 47 | 
            -
                                kind,
         | 
| 159 | 
            +
                                plt=None,  # plotter
         | 
| 160 | 
            +
                                kind="single",
         | 
| 161 | 
            +
                                mindist=0.01,
         | 
| 48 162 | 
             
                                symtol=0.0,
         | 
| 49 163 | 
             
                                sympart=0,
         | 
| 50 164 | 
             
                                is_inner=False,
         | 
| @@ -56,11 +170,13 @@ def symmetry_search(machine, | |
| 56 170 | 
             
                                num=1):
         | 
| 57 171 | 
             
                logger.info("*** Begin symmetry search for %s ***", kind)
         | 
| 58 172 |  | 
| 59 | 
            -
                 | 
| 60 | 
            -
                    machine. | 
| 61 | 
            -
             | 
| 62 | 
            -
                    machine. | 
| 173 | 
            +
                def return_machine(machine, kind):
         | 
| 174 | 
            +
                    machine.set_attributes(kind=kind, inner=is_inner, outer=is_outer)
         | 
| 175 | 
            +
                    machine.check_and_correct_geom(kind)
         | 
| 176 | 
            +
                    machine.delete_tiny_elements(mindist)
         | 
| 177 | 
            +
                    return machine
         | 
| 63 178 |  | 
| 179 | 
            +
                machine.set_attributes(kind=kind, inner=is_inner, outer=is_outer)
         | 
| 64 180 | 
             
                machine.clear_cut_lines()
         | 
| 65 181 | 
             
                if show_plots and debug_mode:
         | 
| 66 182 | 
             
                    plt.render_elements(machine.geom, Shape,
         | 
| @@ -71,9 +187,8 @@ def symmetry_search(machine, | |
| 71 187 | 
             
                        logger.error("force symmetry failed")
         | 
| 72 188 | 
             
                        sys.exit(1)
         | 
| 73 189 | 
             
                    machine_ok = machine.get_forced_symmetry(sympart)
         | 
| 74 | 
            -
                    machine_ok.set_kind(kind)
         | 
| 75 190 | 
             
                    logger.info("*** End of symmetry search for %s ***", kind)
         | 
| 76 | 
            -
                    return machine_ok
         | 
| 191 | 
            +
                    return return_machine(machine_ok, kind)
         | 
| 77 192 |  | 
| 78 193 | 
             
                plot_geom(False,  # for developer
         | 
| 79 194 | 
             
                          plt, machine.geom,
         | 
| @@ -92,9 +207,8 @@ def symmetry_search(machine, | |
| 92 207 | 
             
                                            rows=rows, cols=cols, num=num, show=False)
         | 
| 93 208 | 
             
                    machine_slice = machine.get_symmetry_slice()
         | 
| 94 209 | 
             
                    if machine_slice is None:
         | 
| 95 | 
            -
                        machine.kind = kind
         | 
| 96 210 | 
             
                        logger.info(" - no slice extracted ?!?")
         | 
| 97 | 
            -
                        return machine
         | 
| 211 | 
            +
                        return return_machine(machine, kind)
         | 
| 98 212 |  | 
| 99 213 | 
             
                    plot_geom(False,  # for developer
         | 
| 100 214 | 
             
                              plt, machine_slice.geom,
         | 
| @@ -104,13 +218,11 @@ def symmetry_search(machine, | |
| 104 218 | 
             
                    machine_mirror = machine_slice.get_symmetry_mirror(no_third=True)
         | 
| 105 219 |  | 
| 106 220 | 
             
                    if machine_mirror is not None:
         | 
| 107 | 
            -
                        machine_mirror.set_kind(kind)
         | 
| 108 221 | 
             
                        logger.info("*** End of symmetry search for %s (symmetry and mirror) ***", kind)
         | 
| 109 | 
            -
                        return machine_mirror
         | 
| 222 | 
            +
                        return return_machine(machine_mirror, kind)
         | 
| 110 223 |  | 
| 111 | 
            -
                    machine_slice.set_kind(kind)
         | 
| 112 224 | 
             
                    logger.info("*** End of symmetry search for %s (symmetry) ***", kind)
         | 
| 113 | 
            -
                    return machine_slice
         | 
| 225 | 
            +
                    return return_machine(machine_slice, kind)
         | 
| 114 226 |  | 
| 115 227 | 
             
                # --- no symmetry slice found ---
         | 
| 116 228 | 
             
                logger.info(" - {}: no symmetry axis found".format(kind))
         | 
| @@ -129,6 +241,10 @@ def symmetry_search(machine, | |
| 129 241 | 
             
                    machine.rotate_to(0.0)
         | 
| 130 242 | 
             
                    machine.set_alfa_and_corners()
         | 
| 131 243 |  | 
| 244 | 
            +
                plot_geom(False,  # for developer
         | 
| 245 | 
            +
                          plt, machine.geom,
         | 
| 246 | 
            +
                          title="Before Mirror ({})".format(kind))
         | 
| 247 | 
            +
             | 
| 132 248 | 
             
                machine_mirror = machine.get_symmetry_mirror()
         | 
| 133 249 | 
             
                machine_slice = machine
         | 
| 134 250 | 
             
                machine_slice.set_alfa_and_corners()
         | 
| @@ -146,6 +262,9 @@ def symmetry_search(machine, | |
| 146 262 | 
             
                    while machine_next_mirror is not None:
         | 
| 147 263 | 
             
                        logger.info(" - another mirror found")
         | 
| 148 264 | 
             
                        machine_mirror = machine_next_mirror
         | 
| 265 | 
            +
                        plot_geom(False,  # for developer
         | 
| 266 | 
            +
                                  plt, machine_mirror.geom,
         | 
| 267 | 
            +
                                  title="Next Mirror ({})".format(kind))
         | 
| 149 268 | 
             
                        machine_next_mirror = machine_mirror.get_symmetry_mirror()
         | 
| 150 269 |  | 
| 151 270 | 
             
                    machine_ok = machine_mirror
         | 
| @@ -155,10 +274,8 @@ def symmetry_search(machine, | |
| 155 274 | 
             
                    machine_ok.rotate_to(0.0)
         | 
| 156 275 | 
             
                    machine_ok.set_alfa_and_corners()
         | 
| 157 276 |  | 
| 158 | 
            -
                machine_ok.set_kind(kind)
         | 
| 159 | 
            -
             | 
| 160 277 | 
             
                logger.info("*** End of symmetry search for %s ***", kind)
         | 
| 161 | 
            -
                return machine_ok
         | 
| 278 | 
            +
                return return_machine(machine_ok, kind)
         | 
| 162 279 |  | 
| 163 280 |  | 
| 164 281 | 
             
            def build_machine_rotor(machine, inner, mindist, plt, EESM=False, single=False):
         | 
| @@ -313,6 +430,58 @@ def build_machine_stator(machine, inner, mindist, plt, EESM=False, single=False) | |
| 313 430 | 
             
                return machine_temp
         | 
| 314 431 |  | 
| 315 432 |  | 
| 433 | 
            +
            def build_inner_machine(machine,
         | 
| 434 | 
            +
                                    mindist=0.01,
         | 
| 435 | 
            +
                                    plt=None,
         | 
| 436 | 
            +
                                    EESM=False):
         | 
| 437 | 
            +
                logger.info("Begin of build_inner_machine")
         | 
| 438 | 
            +
                machine.search_subregions(EESM)
         | 
| 439 | 
            +
             | 
| 440 | 
            +
                if machine.geom.is_rotor():  # Inner mirrored rotor
         | 
| 441 | 
            +
                    machine = build_machine_rotor(machine,
         | 
| 442 | 
            +
                                                  True,  # is inner
         | 
| 443 | 
            +
                                                  mindist,
         | 
| 444 | 
            +
                                                  plt,
         | 
| 445 | 
            +
                                                  EESM=EESM)
         | 
| 446 | 
            +
             | 
| 447 | 
            +
                if machine.geom.is_stator() or machine.has_windings():
         | 
| 448 | 
            +
                    machine = build_machine_stator(machine,
         | 
| 449 | 
            +
                                                   True,
         | 
| 450 | 
            +
                                                   mindist,
         | 
| 451 | 
            +
                                                   plt,
         | 
| 452 | 
            +
                                                   EESM=EESM)
         | 
| 453 | 
            +
             | 
| 454 | 
            +
                machine.search_critical_elements(mindist)
         | 
| 455 | 
            +
                logger.info("End of build_inner_machine")
         | 
| 456 | 
            +
                return machine
         | 
| 457 | 
            +
             | 
| 458 | 
            +
             | 
| 459 | 
            +
            def build_outer_machine(machine,
         | 
| 460 | 
            +
                                    mindist=0.01,
         | 
| 461 | 
            +
                                    plt=None,
         | 
| 462 | 
            +
                                    EESM=False):
         | 
| 463 | 
            +
                logger.info("Begin of build_outer_machine")
         | 
| 464 | 
            +
                machine.search_subregions(EESM)
         | 
| 465 | 
            +
             | 
| 466 | 
            +
                if machine.geom.is_rotor():  # Outer mirrored rotor
         | 
| 467 | 
            +
                    machine = build_machine_rotor(machine,
         | 
| 468 | 
            +
                                                  False,  # is outer
         | 
| 469 | 
            +
                                                  mindist,
         | 
| 470 | 
            +
                                                  plt,
         | 
| 471 | 
            +
                                                  EESM=EESM)
         | 
| 472 | 
            +
             | 
| 473 | 
            +
                if machine.geom.is_stator() or machine.has_windings():
         | 
| 474 | 
            +
                    machine = build_machine_stator(machine,
         | 
| 475 | 
            +
                                                   False,
         | 
| 476 | 
            +
                                                   mindist,
         | 
| 477 | 
            +
                                                   plt,
         | 
| 478 | 
            +
                                                   EESM=EESM)
         | 
| 479 | 
            +
             | 
| 480 | 
            +
                machine.search_critical_elements(mindist)
         | 
| 481 | 
            +
                logger.info("End of build_outer_machine")
         | 
| 482 | 
            +
                return machine
         | 
| 483 | 
            +
             | 
| 484 | 
            +
             | 
| 316 485 | 
             
            def convert(dxfile,
         | 
| 317 486 | 
             
                        EESM=False,
         | 
| 318 487 | 
             
                        rtol=1e-04,
         | 
| @@ -340,7 +509,8 @@ def convert(dxfile, | |
| 340 509 | 
             
                        write_id=False,
         | 
| 341 510 | 
             
                        full_model=False,
         | 
| 342 511 | 
             
                        debug_mode=False,
         | 
| 343 | 
            -
                        write_journal=False | 
| 512 | 
            +
                        write_journal=False,
         | 
| 513 | 
            +
                        no_processing=False):
         | 
| 344 514 | 
             
                global journal
         | 
| 345 515 | 
             
                layers = ()
         | 
| 346 516 | 
             
                conv = {}
         | 
| @@ -361,6 +531,7 @@ def convert(dxfile, | |
| 361 531 | 
             
                                basename,
         | 
| 362 532 | 
             
                                __version__)
         | 
| 363 533 | 
             
                timer = Timer(start_it=True)
         | 
| 534 | 
            +
                start_timer = Timer(start_it=True)
         | 
| 364 535 |  | 
| 365 536 | 
             
                journal = getJournal(name='converter_journal', aktiv=write_journal)
         | 
| 366 537 | 
             
                journal.get_journal(input_file.name)
         | 
| @@ -391,6 +562,8 @@ def convert(dxfile, | |
| 391 562 |  | 
| 392 563 | 
             
                if write_fsl_single:
         | 
| 393 564 | 
             
                    write_fsl = True
         | 
| 565 | 
            +
                if small_plots:
         | 
| 566 | 
            +
                    show_plots = False
         | 
| 394 567 |  | 
| 395 568 | 
             
                try:
         | 
| 396 569 | 
             
                    if input_file.suffix in ['.fem', '.FEM']:
         | 
| @@ -438,8 +611,6 @@ def convert(dxfile, | |
| 438 611 | 
             
                logger.info("total elements %s", len(basegeom.g.edges()))
         | 
| 439 612 |  | 
| 440 613 | 
             
                p = PlotRenderer()
         | 
| 441 | 
            -
                if small_plots:
         | 
| 442 | 
            -
                    show_plots = False
         | 
| 443 614 |  | 
| 444 615 | 
             
                if view_only:
         | 
| 445 616 | 
             
                    logger.info("View only")
         | 
| @@ -466,6 +637,7 @@ def convert(dxfile, | |
| 466 637 |  | 
| 467 638 | 
             
                if not (machine_base.part > 0):
         | 
| 468 639 | 
             
                    # machine shape is unclear
         | 
| 640 | 
            +
                    logger.warn("machine shape is unclear")
         | 
| 469 641 | 
             
                    machine_base.set_center(0.0, 0.0)
         | 
| 470 642 | 
             
                    machine_base.set_radius(9999999)
         | 
| 471 643 |  | 
| @@ -556,72 +728,63 @@ def convert(dxfile, | |
| 556 728 | 
             
                                                             connect=True)
         | 
| 557 729 | 
             
                                machine_outer.set_outer()
         | 
| 558 730 |  | 
| 731 | 
            +
                    start_timer.stop("-- first part in %0.4f seconds --", info=True)
         | 
| 732 | 
            +
                    process_timer = Timer(start_it=True)
         | 
| 559 733 | 
             
                    # inner part
         | 
| 560 | 
            -
                     | 
| 561 | 
            -
             | 
| 562 | 
            -
             | 
| 563 | 
            -
             | 
| 564 | 
            -
             | 
| 565 | 
            -
             | 
| 566 | 
            -
             | 
| 567 | 
            -
             | 
| 568 | 
            -
             | 
| 569 | 
            -
             | 
| 570 | 
            -
             | 
| 571 | 
            -
             | 
| 734 | 
            +
                    inner_queue = multiprocessing.Queue()
         | 
| 735 | 
            +
                    inner_proc = SymSearchProcess(name="Inner",  # for logger
         | 
| 736 | 
            +
                                                  queue=inner_queue,
         | 
| 737 | 
            +
                                                  machine=machine_inner,
         | 
| 738 | 
            +
                                                  plt=None,  # plot
         | 
| 739 | 
            +
                                                  kind=inner_name,
         | 
| 740 | 
            +
                                                  is_inner=True,
         | 
| 741 | 
            +
                                                  mindist=mindist,
         | 
| 742 | 
            +
                                                  symtol=symtol,
         | 
| 743 | 
            +
                                                  show_plots=show_plots,
         | 
| 744 | 
            +
                                                  rows=3,  # rows
         | 
| 745 | 
            +
                                                  cols=2,  # columns
         | 
| 746 | 
            +
                                                  num=3,   # start num
         | 
| 747 | 
            +
                                                  no_processing=no_processing)
         | 
| 748 | 
            +
                    inner_proc.start_task()
         | 
| 572 749 |  | 
| 573 750 | 
             
                    # outer part
         | 
| 574 751 | 
             
                    machine_outer = symmetry_search(machine_outer,
         | 
| 575 | 
            -
                                                    p,  # plot
         | 
| 576 | 
            -
                                                    outer_name,
         | 
| 752 | 
            +
                                                    plt=p,  # plot
         | 
| 753 | 
            +
                                                    kind=outer_name,
         | 
| 577 754 | 
             
                                                    is_outer=True,
         | 
| 755 | 
            +
                                                    mindist=mindist,
         | 
| 578 756 | 
             
                                                    symtol=symtol,
         | 
| 579 757 | 
             
                                                    show_plots=show_plots,
         | 
| 580 758 | 
             
                                                    rows=3,  # rows
         | 
| 581 759 | 
             
                                                    cols=2,  # columns
         | 
| 582 760 | 
             
                                                    num=4)   # start num
         | 
| 583 | 
            -
                    machine_outer.check_and_correct_geom("Outer")
         | 
| 584 | 
            -
                    machine_outer.delete_tiny_elements(mindist)
         | 
| 585 | 
            -
             | 
| 586 | 
            -
                    machine_inner.sync_with_counterpart(machine_outer)
         | 
| 587 761 |  | 
| 588 | 
            -
                    machine_inner. | 
| 589 | 
            -
                     | 
| 762 | 
            +
                    machine_inner = inner_queue.get()
         | 
| 763 | 
            +
                    inner_proc.wait()
         | 
| 764 | 
            +
                    process_timer.stop("-- symmetry search in %0.4f seconds --", info=True)
         | 
| 590 765 |  | 
| 591 | 
            -
                    # Inner mirrored rotor
         | 
| 592 | 
            -
                    if machine_inner.geom.is_rotor():
         | 
| 593 | 
            -
                        machine_inner = build_machine_rotor(machine_inner,
         | 
| 594 | 
            -
                                                            True,  # is inner
         | 
| 595 | 
            -
                                                            mindist,
         | 
| 596 | 
            -
                                                            p,
         | 
| 597 | 
            -
                                                            EESM=EESM)
         | 
| 598 | 
            -
             | 
| 599 | 
            -
                    # Outer mirrored rotor
         | 
| 600 | 
            -
                    if machine_outer.geom.is_rotor():
         | 
| 601 | 
            -
                        machine_outer = build_machine_rotor(machine_outer,
         | 
| 602 | 
            -
                                                            False,  # is outer
         | 
| 603 | 
            -
                                                            mindist,
         | 
| 604 | 
            -
                                                            p,
         | 
| 605 | 
            -
                                                            EESM=EESM)
         | 
| 606 | 
            -
             | 
| 607 | 
            -
                    if machine_inner.geom.is_stator() or machine_inner.has_windings():
         | 
| 608 | 
            -
                        machine_inner = build_machine_stator(machine_inner,
         | 
| 609 | 
            -
                                                             True,
         | 
| 610 | 
            -
                                                             mindist,
         | 
| 611 | 
            -
                                                             p,
         | 
| 612 | 
            -
                                                             EESM=EESM)
         | 
| 613 | 
            -
             | 
| 614 | 
            -
                    if machine_outer.geom.is_stator() or machine_outer.has_windings():
         | 
| 615 | 
            -
                        machine_outer = build_machine_stator(machine_outer,
         | 
| 616 | 
            -
                                                             False,
         | 
| 617 | 
            -
                                                             mindist,
         | 
| 618 | 
            -
                                                             p,
         | 
| 619 | 
            -
                                                             EESM=EESM)
         | 
| 620 766 | 
             
                    machine_inner.sync_with_counterpart(machine_outer)
         | 
| 621 767 |  | 
| 622 | 
            -
                     | 
| 623 | 
            -
                     | 
| 768 | 
            +
                    final_timer = Timer(start_it=True)
         | 
| 769 | 
            +
                    inner_queue = multiprocessing.Queue()
         | 
| 770 | 
            +
                    inner_proc = BuildInnerProcess(name="Inner",  # for logger
         | 
| 771 | 
            +
                                                   queue=inner_queue,
         | 
| 772 | 
            +
                                                   machine=machine_inner,
         | 
| 773 | 
            +
                                                   mindist=mindist,
         | 
| 774 | 
            +
                                                   plt=p,
         | 
| 775 | 
            +
                                                   EESM=EESM,
         | 
| 776 | 
            +
                                                   no_processing=no_processing)
         | 
| 777 | 
            +
                    inner_proc.start_task()
         | 
| 778 | 
            +
             | 
| 779 | 
            +
                    machine_outer = build_outer_machine(machine_outer,
         | 
| 780 | 
            +
                                                        mindist,
         | 
| 781 | 
            +
                                                        p,
         | 
| 782 | 
            +
                                                        EESM=EESM)
         | 
| 783 | 
            +
                    machine_inner = inner_queue.get()
         | 
| 784 | 
            +
                    inner_proc.wait()
         | 
| 785 | 
            +
                    final_timer.stop("-- final part in %0.4f seconds --", info=True)
         | 
| 624 786 |  | 
| 787 | 
            +
                    machine_inner.sync_with_counterpart(machine_outer)
         | 
| 625 788 | 
             
                    logger.info("***** END of work: %s *****", basename)
         | 
| 626 789 |  | 
| 627 790 | 
             
                    if machine_inner.geom.is_rotor():
         | 
| @@ -776,10 +939,11 @@ def convert(dxfile, | |
| 776 939 | 
             
                            outer = True
         | 
| 777 940 |  | 
| 778 941 | 
             
                    machine = symmetry_search(machine,
         | 
| 779 | 
            -
                                              p,  # plot
         | 
| 780 | 
            -
                                              name,
         | 
| 942 | 
            +
                                              plt=p,  # plot
         | 
| 943 | 
            +
                                              kind=name,
         | 
| 781 944 | 
             
                                              is_inner=inner,
         | 
| 782 945 | 
             
                                              is_outer=outer,
         | 
| 946 | 
            +
                                              mindist=mindist,
         | 
| 783 947 | 
             
                                              symtol=symtol,
         | 
| 784 948 | 
             
                                              sympart=sympart,
         | 
| 785 949 | 
             
                                              show_plots=show_plots,
         | 
    
        femagtools/dxfsl/fslrenderer.py
    CHANGED
    
    | @@ -26,28 +26,18 @@ def agndst(da1, da2, Q, p, nodedist=1): | |
| 26 26 | 
             
                """
         | 
| 27 27 | 
             
                r = (da1 + da2)/4
         | 
| 28 28 | 
             
                ag = abs(da1 - da2)/6
         | 
| 29 | 
            -
                 | 
| 30 | 
            -
             | 
| 31 | 
            -
                 | 
| 32 | 
            -
                 | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
                     | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
                 | 
| 41 | 
            -
                try:
         | 
| 42 | 
            -
                    logger.info("Num nodes/p %d Num nodes/slot %g nodedist %g",
         | 
| 43 | 
            -
                                num_nodes[i-1], p*num_nodes[i-1]/Q, nodedist)
         | 
| 44 | 
            -
                    if nodedist > 1:
         | 
| 45 | 
            -
                        return dagset[i-nd]*r
         | 
| 46 | 
            -
                    if nodedist < 1 or i == 0:
         | 
| 47 | 
            -
                        return dagset[i]*r
         | 
| 48 | 
            -
                except IndexError:
         | 
| 49 | 
            -
                    pass
         | 
| 50 | 
            -
                return dagset[i-1]*r
         | 
| 29 | 
            +
                lcm = np.lcm(Q, p)//p
         | 
| 30 | 
            +
                taup = 2*np.pi*r/p
         | 
| 31 | 
            +
                nmin, nmax = max(1, 18//lcm), 480//lcm
         | 
| 32 | 
            +
                num_nodes = [i*lcm for i in range(nmin, nmax)
         | 
| 33 | 
            +
                             if i*lcm % 6 == 0 and i*lcm*p//Q % 2 == 0]
         | 
| 34 | 
            +
                dagset = np.array([taup/i for i in num_nodes])
         | 
| 35 | 
            +
                i = np.argmin(np.abs(dagset - ag*nodedist))
         | 
| 36 | 
            +
                if i > 0 and dagset[i]*nodedist < ag:
         | 
| 37 | 
            +
                    i -= 1
         | 
| 38 | 
            +
                logger.info("%d Num nodes/p %d Num nodes/slot %g nodedist %g",
         | 
| 39 | 
            +
                            i, num_nodes[i], p*num_nodes[i]/Q, nodedist)
         | 
| 40 | 
            +
                return dagset[i]
         | 
| 51 41 |  | 
| 52 42 |  | 
| 53 43 | 
             
            class FslRenderer(object):
         | 
| @@ -629,9 +619,15 @@ class FslRenderer(object): | |
| 629 619 | 
             
                                'x2, y2 = pr2c(outer_da_start, 0.0)',
         | 
| 630 620 | 
             
                                'nc_line(r2, 0.0, x2, y2, 0.0)\n',
         | 
| 631 621 | 
             
                                'if m.tot_num_slot > m.num_sl_gen then',
         | 
| 622 | 
            +
                                '  if inner_da_end == nil then',
         | 
| 623 | 
            +
                                '    inner_da_end = inner_da_start',
         | 
| 624 | 
            +
                                '  end',
         | 
| 632 625 | 
             
                                '  x3, y3 = pr2c(inner_da_end, alfa)',
         | 
| 633 626 | 
             
                                '  x4, y4 = pr2c(r1, alfa)',
         | 
| 634 627 | 
             
                                '  nc_line(x3, y3, x4, y4, 0, 0)\n',
         | 
| 628 | 
            +
                                '  if outer_da_end == nil then',
         | 
| 629 | 
            +
                                '    outer_da_end = outer_da_start',
         | 
| 630 | 
            +
                                '  end',
         | 
| 635 631 | 
             
                                '  x3, y3 = pr2c(outer_da_end, alfa)',
         | 
| 636 632 | 
             
                                '  x4, y4 = pr2c(r2, alfa)',
         | 
| 637 633 | 
             
                                '  nc_line(x3, y3, x4, y4, 0, 0)',
         | 
    
        femagtools/dxfsl/functions.py
    CHANGED
    
    | @@ -12,6 +12,7 @@ import logging | |
| 12 12 | 
             
            import numpy as np
         | 
| 13 13 | 
             
            import copy
         | 
| 14 14 | 
             
            import time
         | 
| 15 | 
            +
            import multiprocessing
         | 
| 15 16 |  | 
| 16 17 | 
             
            logger = logging.getLogger('femagtools.functions')
         | 
| 17 18 |  | 
| @@ -76,8 +77,8 @@ def alpha_triangle(a, b, c): | |
| 76 77 | 
             
                return rslt
         | 
| 77 78 |  | 
| 78 79 |  | 
| 79 | 
            -
            def alpha_angle(startangle, endangle):
         | 
| 80 | 
            -
                if less_equal(endangle, startangle):
         | 
| 80 | 
            +
            def alpha_angle(startangle, endangle, rtol=1e-3, atol=1e-8):
         | 
| 81 | 
            +
                if less_equal(endangle, startangle, rtol=rtol, atol=atol):
         | 
| 81 82 | 
             
                    endangle += 2.0*np.pi
         | 
| 82 83 | 
             
                angle = endangle - startangle
         | 
| 83 84 | 
             
                if less_equal(angle, 2.0*np.pi):
         | 
| @@ -480,3 +481,24 @@ class Timer(object): | |
| 480 481 | 
             
                        else:
         | 
| 481 482 | 
             
                            logger.debug(fmt, sec)
         | 
| 482 483 | 
             
                    return sec
         | 
| 484 | 
            +
             | 
| 485 | 
            +
             | 
| 486 | 
            +
            class SimpleProcess(multiprocessing.Process):
         | 
| 487 | 
            +
                def __init__(self, name=None, no_processing=False):
         | 
| 488 | 
            +
                    super(SimpleProcess, self).__init__()
         | 
| 489 | 
            +
                    self._no_processing = no_processing
         | 
| 490 | 
            +
                    self.name = name
         | 
| 491 | 
            +
             | 
| 492 | 
            +
                def without_processing(self):
         | 
| 493 | 
            +
                    return self._no_processing
         | 
| 494 | 
            +
             | 
| 495 | 
            +
                def wait(self):
         | 
| 496 | 
            +
                    if not self._no_processing:
         | 
| 497 | 
            +
                        logger.debug("%s Waiting for Process", self.name)
         | 
| 498 | 
            +
                        self.join()
         | 
| 499 | 
            +
             | 
| 500 | 
            +
                def start_task(self):
         | 
| 501 | 
            +
                    if self._no_processing:
         | 
| 502 | 
            +
                        self.run()
         | 
| 503 | 
            +
                        return
         | 
| 504 | 
            +
                    self.start()
         |