From c80b7ab441b568a552c18467b5bfda8de1d20145 Mon Sep 17 00:00:00 2001 From: Craig Warren Date: Wed, 4 May 2016 10:10:11 +0100 Subject: [PATCH] More updates to Taguchi optimisation docs. --- .../images/{ => user_libs}/AustinMan.png | Bin .../images/{ => user_libs}/AustinMan_head.png | Bin .../images/user_libs/antenna_bowtie_opt.png | Bin 0 -> 45841 bytes .../{ => user_libs}/taguchi_process.png | Bin docs/source/user_libs_austinman.rst | 4 +- docs/source/user_libs_opt_taguchi.rst | 11 ++- .../antenna_bowtie_opt.in | 93 ++++++++++++++++++ 7 files changed, 104 insertions(+), 4 deletions(-) rename docs/source/images/{ => user_libs}/AustinMan.png (100%) rename docs/source/images/{ => user_libs}/AustinMan_head.png (100%) create mode 100644 docs/source/images/user_libs/antenna_bowtie_opt.png rename docs/source/images/{ => user_libs}/taguchi_process.png (100%) create mode 100644 user_libs/optimisation_taguchi/antenna_bowtie_opt.in diff --git a/docs/source/images/AustinMan.png b/docs/source/images/user_libs/AustinMan.png similarity index 100% rename from docs/source/images/AustinMan.png rename to docs/source/images/user_libs/AustinMan.png diff --git a/docs/source/images/AustinMan_head.png b/docs/source/images/user_libs/AustinMan_head.png similarity index 100% rename from docs/source/images/AustinMan_head.png rename to docs/source/images/user_libs/AustinMan_head.png diff --git a/docs/source/images/user_libs/antenna_bowtie_opt.png b/docs/source/images/user_libs/antenna_bowtie_opt.png new file mode 100644 index 0000000000000000000000000000000000000000..36b8467ab6d2488a81d8c9e56ad9e486984e4ccd GIT binary patch literal 45841 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%0A>_ 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. -.. figure:: images/AustinMan.png +.. figure:: images/user_libs/AustinMan.png :width: 300 px FDTD geometry mesh showing the AustinMan body model (2x2x2mm^3). diff --git a/docs/source/user_libs_opt_taguchi.rst b/docs/source/user_libs_opt_taguchi.rst index 972cdccb..d16ed7a7 100644 --- a/docs/source/user_libs_opt_taguchi.rst +++ b/docs/source/user_libs_opt_taguchi.rst @@ -22,7 +22,7 @@ Information # # Please use the attribution at http://dx.doi.org/10.1190/1.3548506 -The package features an optimisation technique based on Taguchi's method. It allows the user to define parameters in an input file and optimise their values based on a fitness function. +The package features an optimisation technique based on Taguchi's method. It allows users to define parameters in an input file and optimise their values based on a fitness function, for example it can be used to optimise material properties or geometry in a simulation. Taguchi's method @@ -44,11 +44,13 @@ Package overview .. code-block:: none + antenna_bowtie_opt.in OA_9_4_3_2.npy OA_18_7_3_2.npy optimisation_taguchi_fitness.py optimisation_taguchi_plot.py +* ``antenna_bowtie_opt.in`` is a example model of a bowtie antenna where values of loading resistors are optimised. * ``OA_9_4_3_2.npy`` and ``OA_18_7_3_2.npy`` are NumPy archives containing pre-built OAs from http://neilsloane.com/oadir/ * ``optimisation_taguchi_fitness.py`` is a module containing fitness functions. There are some pre-built ones but users should add their own here. * ``optimisation_taguchi_plot.py`` is a module for plotting the results, such as parameter values and convergence history, from an optimisation process when it has completed. @@ -58,7 +60,7 @@ Implementation The process by which Taguchi's method optimises parameters is illustrated in the following figure. -.. figure:: images/taguchi_process.png +.. figure:: images/user_libs/taguchi_process.png :width: 300 px Process associated with Taguchi's method. @@ -93,3 +95,8 @@ Example The following example demonstrates using the Taguchi optimisation process to optimise values of loading resistors used in a bowtie antenna. The bowtie design features 3 slots in each arm of the bowtie where loading resistors are placed, and a substrate with a perimittivity of 4.8 is used. The antenna is modelled in free space, and an output point (the electric field value) is specified at a distance of 60 mm from the feed of the bowtie. +.. figure:: images/user_libs/antenna_bowtie_opt.png + :width: 600 px + + FDTD geometry mesh showing bowtie antenna with slots and loading resistors. + diff --git a/user_libs/optimisation_taguchi/antenna_bowtie_opt.in b/user_libs/optimisation_taguchi/antenna_bowtie_opt.in new file mode 100644 index 00000000..53f1bfdb --- /dev/null +++ b/user_libs/optimisation_taguchi/antenna_bowtie_opt.in @@ -0,0 +1,93 @@ +#taguchi: +optparams['resinner'] = [0.1, 5000] +optparams['resmiddle'] = [0.1, 5000] +optparams['resouter'] = [0.1, 5000] +fitness = {'name': 'compactness', 'stop': 30, 'args': {'outputs': 'Ex60mm'}} +maxiterations = 5 +#end_taguchi: + +#python: + +import numpy as np +from gprMax.input_cmd_funcs import * + +title = 'antenna_bowtie_opt' +print('#title: {}'.format(title)) + +domain = domain(0.180, 0.120, 0.160) +dxdydz = dx_dy_dz(0.001, 0.001, 0.001) +timewindow = time_window(5e-9) +fr4_dims = (0.120, 0.060, 0.002) +bowtie_dims = (0.050, 0.040) # Length, height +flare_angle = np.arctan((bowtie_dims[1]/2) / bowtie_dims[0]) +tx_pos = (domain[0]/2, domain[1]/2, 0.050) + +# Vertical slot positions, relative to feed position, i.e. txpos[0] +vcut_pos = (0.014, 0.027, 0.038) + +# Loading resistor values +res = np.array([optparams['resinner'], optparams['resmiddle'], optparams['resouter']]) +rescond = ((1 / res) * (dxdydz[1] / (dxdydz[0] * dxdydz[2]))) / 2 # Divide by number of parallel edges per resistor + +# Materials +material(4.8, 0, 1, 0, 'fr4') +for i in range(len(res)): + material(1, rescond[i], 1, 0, 'res' + str(i + 1)) + +# Source excitation and type +print('#waveform: gaussian 1 2e9 mypulse') +print('#transmission_line: x {:g} {:g} {:g} 50 mypulse'.format(tx_pos[0], tx_pos[1], tx_pos[2])) + +# Output point - distance from tx_pos in z direction +print('#rx: {:g} {:g} {:g} Ex60mm Ex'.format(tx_pos[0], tx_pos[1], tx_pos[2] + 0.060)) + +# Bowtie - upper x half +triangle(tx_pos[0], tx_pos[1], tx_pos[2], tx_pos[0] + bowtie_dims[0], tx_pos[1] - bowtie_dims[1]/2, tx_pos[2], tx_pos[0] + bowtie_dims[0], tx_pos[1] + bowtie_dims[1]/2, tx_pos[2], 0, 'pec') + +# Bowtie - upper x half - vertical cuts +for i in range(len(vcut_pos)): + for j in range(int(bowtie_dims[1] / dxdydz[2])): + edge(tx_pos[0] + vcut_pos[i], tx_pos[1] - bowtie_dims[1]/2 + j * dxdydz[1], tx_pos[2], tx_pos[0] + vcut_pos[i] + dxdydz[0], tx_pos[1] - bowtie_dims[1]/2 + j * dxdydz[1], tx_pos[2], 'free_space') + +# Bowtie - upper x half - vertical cuts - loading +for i in range(len(vcut_pos)): + gap = ((vcut_pos[i] * np.tan(flare_angle) * 2) - 4*dxdydz[1]) / 5 + edge(tx_pos[0] + vcut_pos[i], tx_pos[1] - (1.5 * gap) - dxdydz[1], tx_pos[2], tx_pos[0] + vcut_pos[i] + dxdydz[0], tx_pos[1] - (1.5 * gap) - dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] + vcut_pos[i], tx_pos[1] - (1.5 * gap) - 2*dxdydz[1], tx_pos[2], tx_pos[0] + vcut_pos[i] + dxdydz[0], tx_pos[1] - (1.5 * gap) - 2*dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] + vcut_pos[i], tx_pos[1] - (0.5 * gap), tx_pos[2], tx_pos[0] + vcut_pos[i] + dxdydz[0], tx_pos[1] - (0.5 * gap), tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] + vcut_pos[i], tx_pos[1] - (0.5 * gap) - dxdydz[1], tx_pos[2], tx_pos[0] + vcut_pos[i] + dxdydz[0], tx_pos[1] - (0.5 * gap) - dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] + vcut_pos[i], tx_pos[1] + (0.5 * gap), tx_pos[2], tx_pos[0] + vcut_pos[i] + dxdydz[0], tx_pos[1] + (0.5 * gap), tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] + vcut_pos[i], tx_pos[1] + (0.5 * gap) + dxdydz[1], tx_pos[2], tx_pos[0] + vcut_pos[i] + dxdydz[0], tx_pos[1] + (0.5 * gap) + dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] + vcut_pos[i], tx_pos[1] + (1.5 * gap) + dxdydz[1], tx_pos[2], tx_pos[0] + vcut_pos[i] + dxdydz[0], tx_pos[1] + (1.5 * gap) + dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] + vcut_pos[i], tx_pos[1] + (1.5 * gap) + 2*dxdydz[1], tx_pos[2], tx_pos[0] + vcut_pos[i] + dxdydz[0], tx_pos[1] + (1.5 * gap) + 2*dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + +# Bowtie - lower x half +triangle(tx_pos[0] + dxdydz[0], tx_pos[1], tx_pos[2], tx_pos[0] - bowtie_dims[0], tx_pos[1] - bowtie_dims[1]/2, tx_pos[2], tx_pos[0] - bowtie_dims[0], tx_pos[1] + bowtie_dims[1]/2, tx_pos[2], 0, 'pec') + +# Bowtie - lower x half - cuts for loading +for i in range(len(vcut_pos)): + for j in range(int(bowtie_dims[1] / dxdydz[2])): + edge(tx_pos[0] - vcut_pos[i] - dxdydz[0], tx_pos[1] - bowtie_dims[1]/2 + j * dxdydz[1], tx_pos[2], tx_pos[0] - vcut_pos[i], tx_pos[1] - bowtie_dims[1]/2 + j * dxdydz[1], tx_pos[2], 'free_space') + +# Bowtie - lower x half - vertical cuts - loading +for i in range(len(vcut_pos)): + gap = ((vcut_pos[i] * np.tan(flare_angle) * 2) - 4*dxdydz[1]) / 5 + edge(tx_pos[0] - vcut_pos[i] - dxdydz[0], tx_pos[1] - (1.5 * gap) - dxdydz[1], tx_pos[2], tx_pos[0] - vcut_pos[i], tx_pos[1] - (1.5 * gap) - dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] - vcut_pos[i] - dxdydz[0], tx_pos[1] - (1.5 * gap) - 2*dxdydz[1], tx_pos[2], tx_pos[0] - vcut_pos[i], tx_pos[1] - (1.5 * gap) - 2*dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] - vcut_pos[i] - dxdydz[0], tx_pos[1] - (0.5 * gap), tx_pos[2], tx_pos[0] - vcut_pos[i], tx_pos[1] - (0.5 * gap), tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] - vcut_pos[i] - dxdydz[0], tx_pos[1] - (0.5 * gap) - dxdydz[1], tx_pos[2], tx_pos[0] - vcut_pos[i], tx_pos[1] - (0.5 * gap) - dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] - vcut_pos[i] - dxdydz[0], tx_pos[1] + (0.5 * gap), tx_pos[2], tx_pos[0] - vcut_pos[i], tx_pos[1] + (0.5 * gap), tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] - vcut_pos[i] - dxdydz[0], tx_pos[1] + (0.5 * gap) + dxdydz[1], tx_pos[2], tx_pos[0] - vcut_pos[i], tx_pos[1] + (0.5 * gap) + dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] - vcut_pos[i] - dxdydz[0], tx_pos[1] + (1.5 * gap) + dxdydz[1], tx_pos[2], tx_pos[0] - vcut_pos[i], tx_pos[1] + (1.5 * gap) + dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + edge(tx_pos[0] - vcut_pos[i] - dxdydz[0], tx_pos[1] + (1.5 * gap) + 2*dxdydz[1], tx_pos[2], tx_pos[0] - vcut_pos[i], tx_pos[1] + (1.5 * gap) + 2*dxdydz[1], tx_pos[2], 'res' + str(i + 1)) + +# PCB +box(tx_pos[0] - fr4_dims[0]/2, tx_pos[1] - fr4_dims[1]/2, tx_pos[2] - fr4_dims[2], tx_pos[0] + fr4_dims[0]/2, tx_pos[1] + fr4_dims[1]/2, tx_pos[2], 'fr4') + +# Detailed geometry view of PCB and bowtie +#geometry_view(tx_pos[0] - fr4_dims[0]/2, tx_pos[1] - fr4_dims[1]/2, tx_pos[2] - fr4_dims[2], tx_pos[0] + fr4_dims[0]/2, tx_pos[1] + fr4_dims[1]/2, tx_pos[2] + dxdydz[2], dxdydz[0], dxdydz[1], dxdydz[2], title + '_tx', type='f') + +# Geometry view of entire domain +#geometry_view(0, 0, 0, domain[0], domain[1], domain[2], dxdydz[0], dxdydz[1], dxdydz[2], title) + +#end_python: \ No newline at end of file