1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
#include<iostream>
#include<stdlib.h>
#include <vector>
#include<time.h>
#include<fstream>
#define alpha 0.15
#define itMAX 100
#define vcrit 6
#define f 126 //Tamaño de la matriz bidimensional mxm
#define z 4 //Profundidad de la matriz (coordenada z)
using namespace std;
template<typename ARRAY> vector<ARRAY> dim( int m, ARRAY d ) { return vector<ARRAY>( m, d ); }
int main(void)
{
int i, j, k, l, w, flag, av, d, X, Y, Z, cmax, warn;
int Cx[100], Cy[100], Cz[100], cont, Ex, Ey, Ez, ite;
int it_acum;
int m1 = 10, m2 = 300, m3 = 300;
auto M = dim( m1, dim( m2, dim( m3, 0.0 ) ) );
for ( int i = 0; i < m1; i++ )
for ( int j = 0; j < m2; j++ )
for ( int k = 0; k < m3; k++ ) M[i][j][k] = 0.1 * i + 0.1 * j +0.01* k;
// const int X_size = 5;
// const int Y_size = 301;
// const int Z_size = 301;
//
// double ***M = new double**[X_size];
//
// for (int i = 0; i < X_size; ++i) {
// M[i] = new double*[Y_size];
//
// for (int j = 0; j < Y_size; ++j) {
// M[i][j] = new double[Z_size];
// }
//
// }
//auto M = new float[5][505][505];
//M[0][0][0]=0.123;
//static double M[5][301][301];
float vs_crit, incr, frac; //Matriz de Tamaño [Z][X][Y]
double long acum;
i=0; j=0; k=0; l=0; w=0; flag=0; av=0; d=0; X=0; Y=0; Z=0; cmax=0; warn=0;
cont=0; Ex=0; Ey=0; Ez=0; ite=0; vs_crit=0; incr=1; acum=0; frac=0; //Inicialización de variables
system("cls");
srand(time(NULL)); //Inicializa la generación de numeros aleatorios.
for(i=1;i<f;i++)
for(j=1;j<f;j++)
for(k=1;k<z;k++)
{M[k][i][j]=rand()%600; //Rellena la matriz con numeros aleatorios del 0 al 5.99
M[k][i][j]/=100;
if(M[k][i][j]>vs_crit)
{vs_crit=M[k][i][j]; //Compara si el valor actual es mayor al valor mas cercano
Ex=i; //al critico y guarda sus coordenadas
Ey=j;
Ez=k;
}
}
ofstream out("3D_test.txt", ios::trunc); //ofstream Escribir; ifstream Leer; fstream Leer y Escribir;
//ios::app para escribir al final del archivo ;
//ios::trunc sobreescribe el archivo
do{
//do-while para las iteraciones, se modifica la ultima linea para definir cuantas repeticiones se haran en total
d=0; //contador de la duración del evento de mayor magnitud, se inicializa en 0
av=0; //Contador de la magnitud max del evento, se inicializa en 0
incr=vcrit-vs_crit;
if(incr<0)warn=1;
for(i=1;i<f;i++)
for(j=1;j<f;j++) //este ciclo incrementa a toda la matriz con el valor de incr
for(k=1;k<z;k++)
M[k][i][j]+=incr;
// cout<<"Matriz incremento: \n";
//
// for(i=1;i<f;i++)
// {for(j=1;j<f;j++)
// {
// for(k=1;k<z;k++)
// {cout<<M[k][i][j]<<" "; //imprime la matriz inicial
// }
// cout<<"\t";
// }
// cout<<"\n";
// }
// cout<<"\n"<<endl;
do{
flag=0;
cont=0;
for(i=1;i<f;i++)
for(j=1;j<f;j++)
for(k=1;k<z;k++)
if(M[k][i][j]>=vcrit)
{cont++;
Cx[cont]=i; //El arreglo Cx[] y Cy[] son unicamente para almacenar coordenadas locales,
Cy[cont]=j; //se sobreescriben en cada vuelta
Cz[cont]=k; //Cuenta cuantos 6's se generaron y guarda las coordenadas de este evento
flag=1; //Bandera que avisa que hubo un desborde
if(cont>cmax)cmax=cont;
}
av+=cont;
w=1;
do{
if(flag==1)
{X=Cx[w];
Y=Cy[w];
Z=Cz[w];
frac=alpha*M[Z][X][Y];
M[Z][X-1][Y]=M[Z][X-1][Y]+frac;
M[Z][X+1][Y]=M[Z][X+1][Y]+frac;
M[Z][X][Y-1]=M[Z][X][Y-1]+frac;
M[Z][X][Y+1]=M[Z][X][Y+1]+frac;
M[Z-1][X][Y]=M[Z-1][X][Y]+frac;
M[Z+1][X][Y]=M[Z+1][X][Y]+frac;
M[Z][X][Y]=0;
}
w++;
}while(w<=cont);
if(flag==1)
d++; //cuenta la duracion del evento (cuantas veces recorrio completa la matriz)
vs_crit=0; //Reinicializa el valor sub critico a cero
}while(flag!=0);
ite++;
out<<ite<<"\t"<<av<<"\t"<<d<<"\t"<<Ex<<"\t"<<Ey<<"\t"<<Ez<<endl;
for(i=1;i<f;i++)
for(j=1;j<f;j++)
for(k=1;k<z;k++)
{if(M[k][i][j]>vs_crit)
{vs_crit=M[k][i][j];
Ex=i;
Ey=j;
Ez=k;
}
}
}while(ite<itMAX);
out.close();
cout<<"Desbordes maximos: "<<cmax<<endl;
cout<<"valor de d: "<<d<<endl;
cout<<"valor de av: "<<av<<endl;
cout<<"Valor de warning: "<<warn<<endl;
//delete [] M;
//for (int i = 0; i < X_size; ++i) {
// for (int j = 0; j < Y_size; ++j) {
// delete[] M[i][j];
// }
// delete[] M[i];
// }
// delete[] M;
return 0;
}
|