Please translate this code to C (Wave.c) public class Wave { public static doubl
ID: 3890125 • Letter: P
Question
Please translate this code to C (Wave.c)
public class Wave {
public static double [] linspace(double min, double max, int n) {
int i;
double [] array = new double[n];
double step = (max-min)/(double)(n-1);
array[0] = min;
for(i=1;i<n-1;i++)
array[i] = min+(double)i*step;
array[n-1]=max;
return array;
}
public static double [] zeros(int n) {
int i;
double [] array = new double[n];
for(i=0;i<n;i++)
array[i] = 0.0;
return array;
}
public static void main(String [] args) {
int n=500;
double [] x = linspace(0,10,n);
double [] A = zeros(n);
double [] V = zeros(n);
double [] dVdt = zeros(n);
double dx = x[1]-x[0];
double dxsquared = dx*dx;
int nt=100000;
double [] tgrid = linspace(0,10,nt);
double dt = tgrid[1]- tgrid[0];
int i,it;
for(i=0;i<n;i++) {
A[i] = Math.exp(-(x[i]-5.0)*(x[i]-5.0));
}
for(it=0;it<nt;it++) {
// do some stuff here!!
for(i=1;i<n-1;i++) {
dVdt[i]=(A[i+1]+A[i-1]-2.0*A[i])/dxsquared;
}
for(i=0;i<n;i++) {
A[i]=A[i]+V[i]*dt;
}
for(i=0;i<n;i++) {
V[i]=V[i]+dVdt[i]*dt;
}
}
for(i=0;i<n;i++) {
System.out.printf("%g %g ",x[i],A[i]);
}
}
}
Explanation / Answer
Equivalend Code in C, Changes have been highlighted with bold text
#include <stdio.h>
double* linspace(double min, double max, int n) {
int i;
double* array = (double *) malloc(sizeof(double)*n);
double step = (max - min) / (double)(n - 1);
array[0] = min;
for (i = 1; i<n - 1; i++)
array[i] = min + (double)i*step;
array[n - 1] = max;
return array;
}
double* zeros(int n) {
int i;
double* array = (double *)malloc(sizeof(double)*n);
for (i = 0; i<n; i++)
array[i] = 0.0;
return array;
}
void main() {
int n = 500;
double* x = linspace(0, 10, n);
double* A = zeros(n);
double* V = zeros(n);
double* dVdt = zeros(n);
double dx = x[1] - x[0];
double dxsquared = dx*dx;
int nt = 100000;
double* tgrid = linspace(0, 10, nt);
double dt = tgrid[1] - tgrid[0];
int i, it;
for (i = 0; i<n; i++) {
A[i] = exp(-(x[i] - 5.0)*(x[i] - 5.0));
}
for (it = 0; it<nt; it++) {
// do some stuff here!!
for (i = 1; i<n - 1; i++) {
dVdt[i] = (A[i + 1] + A[i - 1] - 2.0*A[i]) / dxsquared;
}
for (i = 0; i<n; i++) {
A[i] = A[i] + V[i] * dt;
}
for (i = 0; i<n; i++) {
V[i] = V[i] + dVdt[i] * dt;
}
}
for (i = 0; i<n; i++) {
printf("%lf %lf ", x[i], A[i]);
}
}