annotate sim.py @ 18:ab481ded407a

Add GAN140 PP version.
author Daniel O'Connor <darius@dons.net.au>
date Sun, 19 Nov 2023 18:08:19 +1030
parents f0665f53b854
children 28475b505f1f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
1 import datetime
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
2 import pathlib
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
3 from scipy.optimize import differential_evolution
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
4 from spicelib.simulators.ltspice_simulator import LTspice
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
5 from spicelib.log.ltsteps import LTSpiceLogReader
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
6 from spicelib.editor.spice_editor import SpiceEditor
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
7 #from spicelib.sim.sim_runner import SimRunner
14
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
8 import shlex
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
9 import sqlite3
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
10 import subprocess
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
11
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
12 def simulate(src, simexe, simflags, rundir, runname, params):
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
13 src = pathlib.Path(src)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
14 runname = pathlib.Path(runname)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
15 assert(runname.suffix == '.net')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
16 rundir = pathlib.Path(rundir)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
17
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
18 e = SpiceEditor(src)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
19 for k in params:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
20 e.set_parameter(k, params[k])
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
21
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
22 #s = SimRunner(simulator = LTspice, output_folder = 'tmp', verbose = True)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
23 #s.simulator.spice_exe = [simexe]
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
24 #raw_file, log_file = s.run_now(e, run_filename = runname)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
25
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
26 e.write_netlist(rundir / runname)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
27
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
28 cmd = [simexe, '-b']
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
29 cmd.extend(simflags)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
30 cmd.append(runname.name)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
31 then = datetime.datetime.now()
17
f0665f53b854 Show FET power dissipation, don't bother with mod rail
Daniel O'Connor <darius@dons.net.au>
parents: 14
diff changeset
32 #print(f'Starting run {runname} at {then}')
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
33 p = subprocess.Popen(cmd, cwd = rundir)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
34 p.communicate()
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
35 now = datetime.datetime.now()
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
36 taken = now - then
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
37
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
38 if p.returncode != 0:
17
f0665f53b854 Show FET power dissipation, don't bother with mod rail
Daniel O'Connor <darius@dons.net.au>
parents: 14
diff changeset
39 raise Exception(' '.join(map(shlex.quote, cmd)) + ' failed with code ' + str(p.returncode))
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
40
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
41 #rawpath = rundir / runname.with_suffix('.raw')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
42 #raw = spicelib.RawRead(rawpath)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
43 logpath = rundir / runname.with_suffix('.log')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
44 log = LTSpiceLogReader(logpath)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
45
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
46 power = log.get_measure_value('pout')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
47 eff = log.get_measure_value('efficiency')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
48 thd = log.fourier['V(rfout)'][0].thd
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
49 ipeak_u2 = log.get_measure_value('ipeak_u2')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
50 ipeak_u5 = log.get_measure_value('ipeak_u5')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
51 ipeak = max(ipeak_u2, ipeak_u5)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
52
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
53 return then, taken, power, eff, thd, ipeak
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
54
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
55 def calccost(power, eff, thd, ipeak):
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
56 # Calculate the cost
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
57 tpwr = 1500
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
58 tthd = 2
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
59 teff = 90
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
60 imax = 11
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
61
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
62 cost = 0
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
63 if power < tpwr * 0.80:
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
64 cost += 100
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
65 elif power < tpwr:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
66 cost += (tpwr - power) / tpwr / 100
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
67
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
68 if thd > 5 * tthd:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
69 cost += 100
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
70 else:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
71 thdinv = 100 - thd
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
72 tthdinv = 100 - tthd
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
73 if thdinv < tthdinv:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
74 cost += (tthdinv - thdinv) / tthdinv
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
75 if eff < teff:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
76 cost += (teff - eff) / teff
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
77
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
78 if ipeak > imax:
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
79 cost += (ipeak - imax) * 5
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
80
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
81 return cost
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
82
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
83 def fn(v, dsn, simexe, simflags, rundir, circ):
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
84 '''Called by differential_evolution, v contains the evolved parameters, the rest are passed in from the args parameter'.
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
85 Returns the cost value which is being minimised'''
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
86
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
87 # Get parameters for run
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
88 duty, c1, c2, l1, l2 = v
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
89
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
90 # Check if this combination has already been tried
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
91 dbh = sqlite3.connect(dsn)
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
92 cur = dbh.cursor()
14
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
93 cur.execute('SELECT run, power, efficiency, thd, ipeak FROM GAN190 WHERE name = ? AND duty = ? AND c1 = ? AND c2 = ? AND l1 = ? AND l2 = ?',
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
94 (circ, duty, c1, c2, l1, l2))
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
95 tmp = cur.fetchone()
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
96 if tmp is not None:
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
97 run, power, eff, thd, ipeak = tmp
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
98 # Recalculate the cost since it is cheap and might have been tweaked since the original run
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
99 cost = calccost(power, eff, thd, ipeak)
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
100 print(f'Found run {run:3d}: Duty {duty:3.0f}%, C1 {c1:3.0f}pF, C2 {c2:3.0f}pF, L1 {l1:3.0f}uH, L2 {l2:4.0f}nH -> Power: {power:6.1f}W Efficiency: {eff:5.1f}% THD: {thd:5.1f}% IPeak: {ipeak:4.1f}A Cost: {cost:6.2f}')
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
101 return cost
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
102
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
103 # Get next run number
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
104 cur.execute('BEGIN DEFERRED')
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
105 cur.execute('INSERT INTO GAN190 DEFAULT VALUES RETURNING rowid')
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
106 run = cur.fetchone()[0]
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
107 cur.execute('COMMIT')
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
108
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
109 # Run the simulation
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
110 # Need to convert units to suit
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
111 runname = pathlib.Path(circ).stem + '-' + str(run) + '.net'
17
f0665f53b854 Show FET power dissipation, don't bother with mod rail
Daniel O'Connor <darius@dons.net.au>
parents: 14
diff changeset
112 try:
f0665f53b854 Show FET power dissipation, don't bother with mod rail
Daniel O'Connor <darius@dons.net.au>
parents: 14
diff changeset
113 then, taken, power, eff, thd, ipeak = simulate(circ, simexe, simflags, rundir, runname,
f0665f53b854 Show FET power dissipation, don't bother with mod rail
Daniel O'Connor <darius@dons.net.au>
parents: 14
diff changeset
114 {'dutypct' : duty, 'C1' : c1 * 1e-12, 'C2' : c2 * 1e-12, 'L1' : l1 * 1e-6, 'L2' : l2 * 1e-9})
f0665f53b854 Show FET power dissipation, don't bother with mod rail
Daniel O'Connor <darius@dons.net.au>
parents: 14
diff changeset
115 except:
f0665f53b854 Show FET power dissipation, don't bother with mod rail
Daniel O'Connor <darius@dons.net.au>
parents: 14
diff changeset
116 return 100000
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
117 # Calculate the cost
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
118 cost = calccost(power, eff, thd, ipeak)
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
119
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
120 # Log & save the results
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
121 print(f'Run {run:3d}: Duty {duty:3.0f}%, C1 {c1:3.0f}pF, C2 {c2:3.0f}pF, L1 {l1:3.0f}uH, L2 {l2:4.0f}nH -> Power: {power:6.1f}W Efficiency: {eff:5.1f}% THD: {thd:5.1f}% IPeak: {ipeak:4.1f}A Cost: {cost:6.2f}')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
122 taken = taken.seconds + taken.microseconds / 1e6
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
123 cur.execute('BEGIN DEFERRED')
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
124 cur.execute('REPLACE INTO GAN190 (name, run, start, duration, duty, c1, c2, l1, l2, power, efficiency, thd, ipeak, cost) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
14
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
125 (circ, run, then, taken, duty, c1, c2, l1, l2, power, eff, thd, ipeak, cost))
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
126 cur.execute('COMMIT')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
127
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
128 return cost
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
129
14
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
130 def ev(circ):
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
131 # Bounds for parameters
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
132 # Note that the parameters are also constrained to be integral
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
133 bounds = [(10, 80),
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
134 (1, 20),
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
135 (10, 300),
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
136 (1, 20),
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
137 (10, 500)]
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
138
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
139 # Initial solution
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
140 x0 = [36, 10, 155, 5, 140]
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
141
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
142 # Where to save results
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
143 dsn = 'results.db'
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
144 dbh = sqlite3.connect(dsn)
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
145 cur = dbh.cursor()
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
146 cur.execute('''
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
147 CREATE TABLE IF NOT EXISTS GAN190 (
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
148 name TEXT, -- Circuit name
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
149 run INTEGER, -- Run number
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
150 start DATETIME, -- Datetime run started
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
151 duration REAL, -- Length of run (seconds)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
152 duty REAL, -- Duty cyle (%)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
153 c1 REAL, -- Value of C1 (pF)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
154 c2 REAL, -- Value of C2 (pF)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
155 l1 REAL, -- Value of L1 (uH)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
156 l2 REAL, -- Value of L2 (nH)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
157 power REAL, -- Measured power (Watts)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
158 efficiency REAL, -- Measured efficiency (%)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
159 thd REAL, -- Total harmonic distortion (%)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
160 ipeak REAL, -- Peak drain current (A)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
161 cost REAL -- Calculated cost metric
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
162 );''')
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
163
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
164 return differential_evolution(fn, bounds, x0 = x0,
14
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
165 args = (dsn, '/Users/oconnd1/bin/runltspice', [], 'tmp', circ),
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
166 integrality = True, disp = True, seed = 12345, updating = 'deferred', workers = 4)