Resistor mesh: Difference between revisions

→‎{{header|Raku}}: extensive refactor
(→‎{{header|Raku}}: extensive refactor)
Line 1,927:
=={{header|Raku}}==
(formerly Perl 6)
{{trans|cC}}
<lang perl6>my $S*TOLERANCE = 101e-12;
 
sub set-boundary(@mesh,@p1,@p2) {
my @fixed;
@vmesh[1 @p1[0] ; @p1[1] ] = 1;
 
return@mesh[ (@curp2[20] -; @curp2[01]) /] 2= -1;
sub allocmesh ($w, $h) {
gather for ^$h {
take [0 xx $w];
}
}
 
sub force-fixedsolve(@fp1, @p2, Int \w, Int \h) {
my @f[1][1]d = [0 xx w] xx 1h;
my @fV = [6][70 xx w] =xx -1h;
my @curfixed = [0, 0,xx 0w] xx h;
}
set-boundary(@fixed,@p1,@p2);
 
loop {
sub force-v(@v) {
set-boundary(@V,@p1,@p2);
@v[1][1] = 1;
@v[6][7] my $diff = -10;
for (flat ^$h X ^$w) -> $\i, $\j {
}
my @neighbors = grep *.defined, (@vV[$i-1][$;j], @vV[$i][$;j-1], @vV[$i+1][$;j], @vV[$i][$;j+1]).grep: *.defined;
@d[$i][$;j] = $my \v = @vV[$i][$;j] - $v@neighbors.sum / +@neighbors;
sub calc_diff(@v, @d, Int $w, Int $h) {
my $totaldiff += 0v × v unless @fixed[i;j];
for (flat ^$h X ^$w) -> $i, $j {}
my last if $diff =~= 1e100;
my @neighbors = grep *.defined, @v[$i-1][$j], @v[$i][$j-1], @v[$i+1][$j], @v[$i][$j+1];
my $v = [+] @neighbors;
@d[$i][$j] = $v = @v[$i][$j] - $v / +@neighbors;
$total += $v * $v unless @fixed[$i][$j];
}
return $total;
}
sub iter(@v, Int $w, Int $h) {
my @d = allocmesh($w, $h);
my $diff = 1e10;
my @cur = 0, 0, 0;
 
while $diff > 1e for (flat ^h X ^w) -24> \i, \j {
force @V[i;j] -v(= @v)d[i;j];
$diff = calc_diff(@v, @d, $w, $h);
for (flat ^$h X ^$w) -> $i, $j {
@v[$i][$j] -= @d[$i][$j];
}
}
 
my @current;
for (flat ^$h X ^$w) -> $i, $j {
for (flat ^h X @cur[^w) @fixed[$-> \i][$j], + 1\j ]{
@current[ @fixed[i;j]+1 ] += @d[$i][$;j] *× (?$i + ?$j + ($i < $h - 1) + ($j < $w - 1) );
}
(@current[2] - @current[0]) / 2
 
return (@cur[2] - @cur[0]) / 2;
}
my @mesh = allocmesh($S, $S);
 
@fixed = allocmesh($S, $S);
force-fixed(@fixed);
 
say 2 / itersolve (@mesh1, $S1), $S(6,7), 10, 10;</lang>
</lang>
{{out}}
<pre>1.60899124172989</pre>
2,392

edits