|
i am trying to write a code to solve Laplace equation using Successive
Over relaxation(SOR)on a NXN matrix
boundary condition is X^2-y^2
i dont know how to set this boundary condition on the Mesh created by me
here is the code
import numpy as np
from pylab import *
import sys
import copy
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
L =[[]for i in range(2)]
N=int(input("Enter a number N for N x N grid: "))
h=1/N
def clear_list1():
L[1].clear()
L[0].clear()
iterat=0
error=0.75
clear_list1()
xx=np.arange(0,N,h)
yy=np.arange(0,N,h)
x,y = np.meshgrid(xx,yy)
phi= copy.deepcopy((x**2-y**2))
phi[1:-1,1:-1]=0
phi_new = copy.deepcopy(phi)
resid=np.zeros((N,N))
while True:
if iterat<21:
for w in np.linspace(1,2,11):
for i in range(1,N-1):
for j in range(1,N-1):
phi1=(phi[i+1,j]+phi[i-1,j]+phi[i,j+1]+phi[i,j-1])/4
phi[i,j]=w*phi1+(1-w)*phi1
Sumresidual=0
for i in range(1,N-1):
for j in range(1,N-1):
resid[i,j]= -4*phi[i,j]+phi[i+1,j]+phi[i-1,j]+phi[i,j+1]+phi[i,j-1]
Sumresidual=Sumresidual+(resid[i,j])**2
else:
break
iterat=iterat+1
p=np.sqrt(Sumresidual)
L[0].append(p)
L[1].append(w)
ax = plt.axes()
ax.xaxis.set_major_locator(ticker.MaxNLocator(5))
plt.plot(L[0],L[1])
plt.yscale('log')
plt.xlabel('w')
plt.ylabel('|| residual ||')
plt.title('effect of w on residual')
plt.show()
|
|
|
|
|
And what does your code have to do with the C / C++ / MFC Forum?
|
|
|
|
|
hi
I was getting storage overlays in my local variable when I noticed that the SP register was 0X4652E25F0 and my BP registers was 0X4C652E2A60 does that mean that my stack size is 144 bytes
I have a table in the function itself that is 256 bytes to translate ASCII to EBCDIC
beginthread stack size is 0
|
|
|
|
|
Quote: In addition, the stack_size argument can be 0, in which case the operating system uses the same value as the stack that's specified for the main thread.
Don't try to guess what the situation may be just by looking at registers. In most code BP is set as a base register from an offset of SP, but that does not imply any particular stack size.
|
|
|
|
|
I guess it could be set /F compiler option thanks
|
|
|
|
|
ForNow wrote: I guess it could be ... ... anything. Guessing is not generally a good strategy for fixing problems. You need to be sure what the problem is first. Maybe if you show the code where the problem occurs, and a few more details, we could make some useful suggestions.
|
|
|
|
|
if stepped thru the code in Assembler after the function prologue by subtracting BP - SP = stack size right ?
I added code to a source file in Hercules cpu.c thing is its a makefile build which very confusing I was wondering if there isn't -F or /F flag for the stack size I guess it would default to some number my local variables and parameters would make the stack a little over 300 bytes, which is not too big
I am trying to figure to determine where in the makefile is the compile for CPU.C
Thanks
|
|
|
|
|
I think we are talking at cross-purposes. What you are referring to is a function's frame size, which is a portion of the thread's stack. The frame will be created large enough for all the locally declared variables in that function, so you need to look at the source code to see why it is not large enough, or why it is being overwritten.
The makefile may be using an inference rule for cpu.c, so you cannot always find a specific line which references it. But you should be able to find a reference to it somewhere in the Makefile (or any of its included subfiles). However, as I mentioned, you still need to diagnose the actual problem, and changing the stack size for the final application is unlikely to make any difference.
|
|
|
|
|
I understand finally sorry I’m slow thanks so much
|
|
|
|
|
Dear Respected friends.
good morning. i hope you are fine.
I need your help. I have a problem with smoothing of output. I have this code ..
it exports stair stepping.
Can you help me.?
int Imax = 10;
for ( int I=0; I<imax; i++="" )="" {
="" for="" (int="" iy="0;" iy<ny;="" iy++)="" {
="" ix="0;" ix<nx;="" ix++)="" float="" v1="v[(iy*nx+ix)*nz];
" int="" k1="0;
" k0="0;
" jstart="0;
" while="" (k1="" <="" nz)="" k;
="" (k="k1;" k<nz;="" k++)="" v2="v[(iy*nx+ix)*nz" +="" k];
="" if="" (="" 100.="" *="" fabs(v2="" -v1)="">= sharpeningThreshold_percentage/2. && jstart == 0 ) {
k0 = k;
jstart = 1;
}
if ( 100. * fabs(v2 -v1) / v1 >= sharpeningThreshold_percentage ) {
v1 = v2;
k1 = k;
jstart = 0;
for ( int kk=k0; kk<=k; kk++ )
v[(iy*nx+ix)*nz + kk] = v1;
k0 = k1;
break;
}
v[(iy*nx+ix)*nz + k] = v1;
}
if ( k >= nz-1 )
break;
}
}
}
if ( I < Imax-1 )
smooth(10, 1, v, nx, ny, nz);
}
}
}
|
|
|
|
|
You did not state what the problem is. What are you expecting from your code? What do you get instead that makes you say it is problematic?
"I'm neither for nor against, on the contrary." John Middle
|
|
|
|
|
Dear Friend.
The code works. But the output comes as stair steps. But, this is because of this sharpening .. and I want to alter . if you can give idea how to make the smoothing.
v2 is the velocity of second layer. and v1 is velocity of first layer.
maximum iterations is 10 with the percentage of threshold ..
problem is that it gives sharp stair stepping. while I want to make like smooth signal in output.
If you can guide.
|
|
|
|
|
Hello,
I got problem trying converting type when the var is declared void in function.
How do you do these things !? for example casting short to int from void var (declared short at start)
And can we change a variable type without having to create new var !?
4 days im on, and i dont get solution without rewriting 50 "identical" functions just with changed type...
It's for that im looking to the void type.
Please help
#include <stdio.h>
void calc(void *var) {
int tmp = *(int*)var;
printf("tmp: %i\n", tmp); *(int*)var += 30003;
}
void complexeShortToInt() {
short int vInt2 = 30002;
calc(&vInt2);
printf("complexeShortToInt: %i\n", vInt2);}
int main() {
complexeShortToInt(); return 0;
}
|
|
|
|
|
Do not use void when you know the type that is to be operated on, it makes no sense. And your calc function would be better to return the calculated value, something like:
int calc(int var) {
int tmp = var + 30003;
return tmp;
}
I am not sure what the complexeShortToInt function, or the actual program, is supposed to do.
|
|
|
|
|
Surely it is not to put these sh*tty functions in my program, but it is to understand how i can handle this situation (so i reduced the code at max)
And the real situation of calc is to substitute the standard + - * / operations with "handle" of the overflow.
So for example a declared short int that excess the 32767 limit.
I know the type at start, but maybe it will produce an overflow later, and maybe with difficulty to detect.
So how we handle this situation !?
Here another more complete code, that can represent a var++;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
void calc(char *type, void *var1, char calc, void *var2) {
int tmp1 = *(int*)var1;int tmp2 = *(int*)var2;
printf("tmp1: %i\n", tmp1);
printf("tmp2: %i\n", tmp2);
int max, min;
unsigned int umax, umin;
short int overflow = 0;
if(strncmp(type, "short int", 9)==0) {
max = SHRT_MAX;
min = SHRT_MIN;
}
if(calc == '+') {
}
}
int main() {
short int vInt2 = 32767; short int vInt3 = 1;
calc("short int", &vInt2, '+', &vInt3);
printf("bad convert to int: %i\n", vInt2);
return 0;
}
Edit: So if i dont use void, it seems i have to write lot of calc "identical" function for each type....
modified 10-Feb-18 14:26pm.
|
|
|
|
|
You misunderstand the problem I'm afraid. Using a void pointer makes no difference, as your pointers will still point to different types. For example:
void calc(void* pvoid)
{
int value = *(int*)pvoid:
}
|
|
|
|
|
You too you misunderstood my problem i think, what you say will be handle by the type="float", and so ok a little "repeat" in the function but i find this better than 15 calc functions for each type.
So finally my real problem is for the "return value" that can have their type changed, its for that im thinking casting the void type that point to the initial variable, and i dont know if possible... im asking you.
So my real problem is this &vInt2 declared short int at start, that i want can change his type inside the function calc(), and without to have creating a new variable in the main scope.
Think that this vInt2 is a "main var" where i would do some operations, and automatically convert it to the right type if the initial type is not adapted.
So can we change a variable type without creating a new var !?
Finally if not possible, i can at least alert that this operation is bad for the initial type.
But i wanted to change the type to a bigger if possible, and so i can start with short int and handle more and more if necessary...
Edit: humm i spot a future problem that can break all when the type is changed so i would more think about how i can handle...
Finally my first interrogation come from: how i can protect my program about overflow automatically
So if you have more constructive suggestion...
modified 10-Feb-18 19:30pm.
|
|
|
|
|
luplup wrote: You too you misunderstood my problem i think, No, I understand completely; I am just saying that this is not the way to do it.
|
|
|
|
|
Ahah! finally got it... one var type changing, and one unique calc func, done WITH void* AND WITHOUT!
Sorry but i will keep it for me, as the main rule in this forum... and in any event, its not useful for you, and you well know the way how to do that, its tabou, all MVP devs know its dangerous to try making program without undefined behavior, and the best is to start making app without thinking to that... so 5 years after, you can (eventually) begin thinking to it when the problem appear and maybe recode all from scratch, and the best for you, i think you will love it, it is you can resell another time your sh*tty program because it's not a bug, its feature in your process...
Never i will go back in this forum, supposedly programming, the worst i ever seen... really you are not serious with your answers, you are trolling all the time on all the topics where you write something, but thank for me MacCutchan, you at least write me two lines of code, declaring a function and assigning variable, i dont know where i will be without your advanced experience... okay now i see from where come your 650 000 super value points... Whaou! you are really the best, without distinction! 9 times one of the best MVP helper... respect
I was already having a little preview of what can be an MVP before coming here, and finally it can be worse than i was thinking... so please dont delete my messages, i will keep it for souvenirs, and to show the real things about what is an supposedly "MVP programmer/engineer" and his mentality too... however if you del and so have something to hide, you have to delete this entire forum too, almost completely full of useless answers! now i well understand why it is a desert here...
Sorry for the possible real programmers that are shutting off all the time, but i dont know if there are some here.. no fact in the forum at least, and it seems all of you are "assisted" by fifty layers of abstraction/obscuration in your C++/MFC and then you think you are programmer...
So at NEVER!
|
|
|
|
|
luplup wrote: Never i will go back in this forum
Let's hope so.
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment
"Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst
"I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle
|
|
|
|
|
luplup wrote: Never i will go back in this forum Well, there will be many a dry eye here when you leave.
|
|
|
|
|
luplup wrote: Edit: So if i dont use void, it seems i have to write lot of calc "identical" function for each type....
But you still do not explain the main reason you want to use this "void*" method implementation!
modified 11-Feb-18 5:02am.
|
|
|
|
|
You are NOT using cast correctly.
You must NOT cast types to different types. Just take that rule as an absolute until you have been programming in C/C++ for about 5 years.
Besides other problems in your code you are taking a "short int" and treating it like an "int". That is wrong.
|
|
|
|
|
So please can you show me the right way to cast correctly
I dont want to "lose" my time during 5 years before start learning "real" programming.
So PLEASE show me a tiny code in the right direction, and i will pass 5 years studing it.
Do i have to use calloc/realloc for the int too ? like i used it for the char/struct array.
modified 10-Feb-18 14:19pm.
|
|
|
|
|
luplup wrote: Do i have to use calloc/realloc for the int too ? like i used it for the char/struct array.
Are you programming in C or C++?
|
|
|
|
|