X-Git-Url: https://git.gag.com/?p=debian%2Fatlc;a=blobdiff_plain;f=src%2Fnon_gui%2Fdo_fd_calculation.c;fp=src%2Fnon_gui%2Fdo_fd_calculation.c;h=0000000000000000000000000000000000000000;hp=3cc50a7c58ffb8f04728c1e9b63acf47f19be41f;hb=ec2d2ab8e90a0c4b86ffc2385655c2fb27fcacd9;hpb=795fb988211df268a8f7724bd2f4493c594abee9 diff --git a/src/non_gui/do_fd_calculation.c b/src/non_gui/do_fd_calculation.c deleted file mode 100644 index 3cc50a7..0000000 --- a/src/non_gui/do_fd_calculation.c +++ /dev/null @@ -1,387 +0,0 @@ -/* atlc - arbitrary transmission line calculator, for the analysis of -extern int number_of_workers; -transmission lines are directional couplers. - -Copyright (C) 2002. Dr. David Kirkby, PhD (G8WRB). - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either package_version 2 -of the License, or (at your option) any later package_version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -USA. - -Dr. David Kirkby, e-mail drkirkby at ntlworld.com - -*/ -#include "config.h" - - -#ifdef HAVE_STDLIB_H -#include -#endif - -#include "definitions.h" - -extern int append_flag; -extern int dielectrics_to_consider_just_now, coupler; -extern int num_pes; -extern double **Vij; -extern int height; -extern int number_of_workers; - -void do_fd_calculation(struct transmission_line_properties *data, size_t size, FILE *where_to_print_fp, char *inputfile_filename) -{ - double capacitance_old, capacitance; - double velocity_of_light_in_vacuum; - int count=0; - /* - if (data->dielectrics_in_bitmap > 1) { - fprintf(stderr,"\nSorry, but on the 15th October 2003 I was advised there is an\n"); - fprintf(stderr,"error in atlc when computing systems with multiple dielectrics.\n"); - fprintf(stderr,"So until this problem is fixed, the facility has been disabled.\n\n"); - fprintf(stderr,"I hope to release a new version shortly without this problem.\n"); - exit(1); - } - */ - /* The line of best fit of non_metalic_pixels vs iterations required - is y=0.0011 * non_metallic_pixels + 283. - - I'll ensure finite_difference is called about 10x by using - 0.00011 * the number of non-metallic elements +28 as the number - of times finite_difference is called each time */ - - - - /* The following 10 lines are for a single dielectric 2 conductor line */ - if (data->couplerQ==FALSE) - { - if(data->verbose_level >= 2) - printf("Solving assuming a vacuum dielectric\n"); - capacitance=VERY_LARGE; /* Can be anything large */ - dielectrics_to_consider_just_now=1; - data->dielectrics_to_consider_just_now=1; - - do /* Start a finite calculation */ - { - capacitance_old=capacitance; - -#ifdef ENABLE_POSIX_THREADS - if (number_of_workers == 0) - capacitance=finite_difference_single_threaded(); - else - capacitance=finite_difference_multi_threaded(); -#else - capacitance=finite_difference_single_threaded(); -#endif - - data->C_vacuum=capacitance; - data->C=capacitance; - data->L_vacuum=MU_0*EPSILON_0/capacitance; /* Same as L in *ALL* cases */ - data->Zo_vacuum=sqrt(data->L_vacuum/data->C_vacuum); /* Standard formaul for Zo */ - data->C=capacitance; - if (data->dielectrics_in_bitmap == 1) /* Just get C by simple scaling of Er */ - { - data->C=capacitance*data->found_this_dielectric; /* Scaled by the single dielectric constant */ - data->Er=data->found_this_dielectric; - } - else - data->Er=1.0; - data->Zo=sqrt(data->L_vacuum/data->C); /* Standard formula for Zo */ - data->Zodd=sqrt(data->L_vacuum/data->C); /* Standard formula for Zo */ - velocity_of_light_in_vacuum=1.0/(sqrt(MU_0 * EPSILON_0)); /* around 3x10^8 m/s */ - data->velocity=1.0/pow(data->L_vacuum*data->C,0.5); - data->velocity_factor=data->velocity/velocity_of_light_in_vacuum; - data->relative_permittivity=sqrt(data->velocity_factor); /* ??? XXXXXX */ - if(data->verbose_level > 0 ) /* Only needed if intermediate results wanted. */ - print_data_for_two_conductor_lines(*data, where_to_print_fp, inputfile_filename); - count++; - } while (fabs((capacitance_old-capacitance)/capacitance_old) > data->cutoff); /* end of FD loop */ - if(data->verbose_level >=4) - printf("Total of %d iterations ( %d calls to finite_difference() )\n",ITERATIONS*count,count); - - if((data->write_binary_field_imagesQ == TRUE || data->write_bitmap_field_imagesQ == TRUE) && data->dielectrics_in_bitmap==1 ) - write_fields_for_two_conductor_lines(inputfile_filename, *data, size); - if(data->verbose_level == 0 && data->dielectrics_in_bitmap==1 ) - print_data_for_two_conductor_lines(*data, where_to_print_fp, inputfile_filename); - - if ( data->dielectrics_in_bitmap >1) - { - /* We know the capacitance and inductance for the air spaced line - as we calculated it above. Howerver, whilst the inductance - is independant of the dielectric, the capacitance is not, so this - has to be recalculated, taking care not to alter the inductance - at all */ - if(data->verbose_level >= 2) - printf("Now taking into account the permittivities of the different dielectrics for 2 conductors.\n"); - - dielectrics_to_consider_just_now=3; /* Any number > 1 */ - data->dielectrics_to_consider_just_now=2; /* Any number > 1 */ - - capacitance=VERY_LARGE; /* Can be anything large */ - - do /* Start a finite calculation */ - { - capacitance_old=capacitance; -#ifdef ENABLE_POSIX_THREADS - if (number_of_workers == 0) - capacitance=finite_difference_single_threaded(); - else - capacitance=finite_difference_multi_threaded(); -#else - capacitance=finite_difference_single_threaded(); -#endif - data->C=capacitance; - data->C_non_vacuum=capacitance; - data->Zo=sqrt(data->L_vacuum/data->C_non_vacuum); /* Standard formula for Zo */ - data->velocity=1.0/pow(data->L_vacuum*data->C_non_vacuum,0.5); - data->velocity_factor=data->velocity/velocity_of_light_in_vacuum; - data->relative_permittivity=sqrt(data->velocity_factor); /* ??? XXXXXX */ - data->Er=data->C/data->C_vacuum; - if(data->verbose_level > 0 ) /* Only needed if intermediate results wanted. */ - print_data_for_two_conductor_lines(*data, where_to_print_fp, inputfile_filename); - } while (fabs((capacitance_old-capacitance)/capacitance_old) > data->cutoff); /* end of FD loop */ - - /* We must print the results now, but only bother if the verbose level was - not not incremented on the command line, otherwide there will be two duplicate - lines */ - - if (data->verbose_level == 0) - print_data_for_two_conductor_lines(*data, where_to_print_fp, inputfile_filename); - if(data->write_binary_field_imagesQ == TRUE || data->write_bitmap_field_imagesQ == TRUE) - write_fields_for_two_conductor_lines(inputfile_filename, *data, size); - } - } - else if (data->couplerQ==TRUE) - { - /* The properties of a couplers will be computed in 2 or 4 stages - 1) Compute the odd-mode impedance, assuming a vacuum dielectric, or - if there is just one dielectric, that one. - - 2) Compute the odd-mode impedance, taking into account the effect of - multiple dielectrics, IF NECESSARY - - at this point, the negative voltages will be turned into positive ones. - - 3) Compute the even-mode impedance, assuming a vacuum dielectric, or - if there is just one dielectric, that one. - - 4) Compute the even-mode impedance, taking into account the effect of - multiple dielectrics, IF NECESSARY */ - - /* Stage 1 - compute the odd mode impedance assuming single dielectric */ - data->display = Z_ODD_SINGLE_DIELECTRIC; - dielectrics_to_consider_just_now=1; - data->dielectrics_to_consider_just_now=1; - - capacitance=VERY_LARGE; /* Can be anything large */ - if(data->verbose_level >= 2) - printf("Solving assuming a vacuum dielectric to compute the odd-mode impedance\n"); - - do /* Start a finite difference calculation */ - { - capacitance_old=capacitance; -#ifdef ENABLE_POSIX_THREADS - if (number_of_workers == 0) - capacitance=finite_difference_single_threaded(); - else - capacitance=finite_difference_multi_threaded(); -#else - capacitance=finite_difference_single_threaded(); -#endif - data->Codd_vacuum=capacitance; - data->Codd=capacitance; - data->Lodd_vacuum=MU_0*EPSILON_0/capacitance; /* Same as L in *ALL* cases */ - - data->Zodd_vacuum=sqrt(data->Lodd_vacuum/data->Codd_vacuum); /* Standard formaul for Zodd */ - - if (data->dielectrics_in_bitmap == 1) /* Just get C by simple scaling of Er */ - data->Codd*=data->found_this_dielectric; /* Scaled by the single dielectric constant */ - else - data->Er=1.0; - data->Zodd=sqrt(data->Lodd_vacuum/data->Codd); /* Standard formula for Zo */ - velocity_of_light_in_vacuum=1.0/(sqrt(MU_0 * EPSILON_0)); /* around 3x10^8 m/s */ - /* FPE trapdata->velocity_odd=1.0/pow(data->L_vacuum*data->Codd,0.5); */ - data->velocity_odd=1.0/pow(data->Lodd_vacuum*data->Codd,0.5); - data->velocity_factor_odd=data->velocity_odd/velocity_of_light_in_vacuum; - data->relative_permittivity_odd=sqrt(data->velocity_factor_odd); /* ??? XXXXXX */ - data->Er_odd=data->Codd/data->Codd_vacuum; - data->Zdiff=2.0*data->Zodd; - /* Print text if uses wants it */ - if(data->verbose_level>=1) - print_data_for_directional_couplers(*data, where_to_print_fp, inputfile_filename); - } while (fabs((capacitance_old-capacitance)/capacitance_old) > data->cutoff); /* end of FD loop */ - -#ifdef ENABLE_MPI - mpi_receive_updated_vij_strips(); -#endif /* ENABLE_MPI */ - - /* display bitpamps/binary files if this is the last odd-mode computation */ - if((data->write_binary_field_imagesQ == TRUE || data->write_bitmap_field_imagesQ == TRUE) && data->dielectrics_in_bitmap==1 ) - write_fields_for_directional_couplers(inputfile_filename, *data, size, ODD); - - /* Stage 2 - compute the odd-mode impedance taking into account other dielectrics IF NECESSARY */ - - if ( data->dielectrics_in_bitmap >1) - { - if(data->verbose_level >= 2) - printf("Now taking into account the permittivities of the different dielectrics to compute Zodd.\n"); - data->display = Z_ODD_SINGLE_DIELECTRIC; - capacitance=VERY_LARGE; /* Can be anything large */ - - dielectrics_to_consider_just_now=2; - data->dielectrics_to_consider_just_now=2; - -#ifdef ENABLE_MPI - mpi_send_current_data(); -#endif /* ENABLE_MPI */ - - do /* Start a finite calculation */ - { - capacitance_old=capacitance; -#ifdef ENABLE_POSIX_THREADS - if (number_of_workers == 0) - capacitance=finite_difference_single_threaded(); - else - capacitance=finite_difference_multi_threaded(); -#else - capacitance=finite_difference_single_threaded(); -#endif - data->Codd=capacitance; - data->Zodd=sqrt(data->Lodd_vacuum/data->Codd); /* Standard formula for Zo */ - velocity_of_light_in_vacuum=1.0/(sqrt(MU_0 * EPSILON_0)); /* around 3x10^8 m/s */ - data->velocity_odd=1.0/pow(data->L_vacuum*data->C,0.5); - data->velocity_factor_odd=data->velocity/velocity_of_light_in_vacuum; - data->relative_permittivity_odd=sqrt(data->velocity_factor); /* ??? XXXXXX */ - data->Er_odd=data->Codd/data->Codd_vacuum; - data->Zdiff=2.0*data->Zodd; - if(data->verbose_level>=1) - print_data_for_directional_couplers(*data, where_to_print_fp, inputfile_filename); - } while (fabs((capacitance_old-capacitance)/capacitance_old) > data->cutoff); /* end of FD loop */ - -#ifdef ENABLE_MPI - mpi_receive_updated_vij_strips(); -#endif /* ENABLE_MPI */ - - if((data->write_binary_field_imagesQ == TRUE || data->write_bitmap_field_imagesQ == TRUE) && data->dielectrics_in_bitmap!=1 ) - write_fields_for_directional_couplers(inputfile_filename, *data, size, ODD); - } /* end of stage 2 for couplers */ - - /* Stage 3 - compute the even-mode impedance assuming single dielectric */ - - /* Since we want the even mode impedance now, we swap all the -1V - metallic conductors for +1V */ - - swap_conductor_voltages(); - - data->display = Z_EVEN_SINGLE_DIELECTRIC; - dielectrics_to_consider_just_now=1; - data->dielectrics_to_consider_just_now=1; - if(data->verbose_level >= 2) - printf("Now assuming a vacuum dielectric to compute Zeven\n"); - - capacitance=VERY_LARGE; /* Can be anything large */ - -#ifdef ENABLE_MPI - mpi_send_current_data(); -#endif /* ENABLE_MPI */ - - do /* Start a finite difference calculation */ - { - capacitance_old=capacitance; -#ifdef ENABLE_POSIX_THREADS - if (number_of_workers == 0) - capacitance=finite_difference_single_threaded(); - else - capacitance=finite_difference_multi_threaded(); -#else - capacitance=finite_difference_single_threaded(); -#endif - - data->Ceven_vacuum=capacitance; - data->Ceven=capacitance; - data->Leven_vacuum=MU_0*EPSILON_0/capacitance; /* Same as L in *ALL* cases */ - - data->Zeven_vacuum=sqrt(data->Leven_vacuum/data->Ceven_vacuum); /* Standard formaul for Zodd */ - - if (data->dielectrics_in_bitmap == 1) /* Just get C by simple scaling of Er */ - data->Ceven*=data->found_this_dielectric; /* Scaled by the single dielectric constant */ - else - data->Er_even=1.0; - data->Zeven=sqrt(data->Leven_vacuum/data->Ceven); /* Standard formula for Zo */ - velocity_of_light_in_vacuum=1.0/(sqrt(MU_0 * EPSILON_0)); /* around 3x10^8 m/s */ - data->velocity_even=1.0/pow(data->Leven_vacuum*data->Ceven,0.5); - data->velocity_factor_even=data->velocity_even/velocity_of_light_in_vacuum; - data->relative_permittivity_even=sqrt(data->velocity_factor_even); /* ??? XXXXXX */ - data->Er_even=data->Ceven/data->Ceven_vacuum; - data->Zcomm=data->Zeven/2.0; - data->Zo=sqrt(data->Zodd * data->Zeven); - if(data->verbose_level>=1) - print_data_for_directional_couplers(*data, where_to_print_fp, inputfile_filename); - /* display bitpamps/binary files if this is the last even-mode computation */ - } while (fabs((capacitance_old-capacitance)/capacitance_old) > data->cutoff); /* end of FD loop */ - - if((data->write_binary_field_imagesQ == TRUE || data->write_bitmap_field_imagesQ == TRUE) && data->dielectrics_in_bitmap==1) - write_fields_for_directional_couplers(inputfile_filename, *data, size, EVEN); - - capacitance=VERY_LARGE; /* Can be anything large */ - /* Stage 4 - compute the even-mode impedance assuming multiple dielectrics IF NECESSARY */ - if ( data->dielectrics_in_bitmap >1) - { - dielectrics_to_consider_just_now=2; - data->dielectrics_to_consider_just_now=2; - if(data->verbose_level >= 2) - printf("Now taking into account the permittivities of the different dielectrics to compute Zeven\n"); - -#ifdef ENABLE_MPI - mpi_send_current_data(); -#endif /* ENABLE_MPI */ - - do /* Start a finite calculation */ - { - capacitance_old=capacitance; -#ifdef ENABLE_POSIX_THREADS - if (number_of_workers == 0) - capacitance=finite_difference_single_threaded(); - else - capacitance=finite_difference_multi_threaded(); -#else - capacitance=finite_difference_single_threaded(); -#endif - data->Ceven=capacitance; - data->Zeven=sqrt(data->Leven_vacuum/data->Ceven); /* Standard formula for Zo */ - velocity_of_light_in_vacuum=1.0/(sqrt(MU_0 * EPSILON_0)); /* around 3x10^8 m/s */ - data->velocity_even=1.0/pow(data->L_vacuum*data->C,0.5); - data->velocity_factor_even=data->velocity/velocity_of_light_in_vacuum; - data->relative_permittivity_even=sqrt(data->velocity_factor); /* ??? XXXXXX */ - data->Er_even=data->Ceven/data->Ceven_vacuum; - data->Zdiff=2.0*data->Zodd; - data->Zcomm=data->Zeven/2.0; - data->Zo=sqrt(data->Zeven*data->Zodd); - if(data->verbose_level>=1) - print_data_for_directional_couplers(*data, where_to_print_fp, inputfile_filename); - } while (fabs((capacitance_old-capacitance)/capacitance_old) > data->cutoff); /* end of FD loop */ - - if(data->write_binary_field_imagesQ == TRUE || data->write_bitmap_field_imagesQ == TRUE) - write_fields_for_directional_couplers(inputfile_filename, *data, size, EVEN); - } /* end of stage 4 */ - /* Print the results if the verbose level was 0 (no -v flag(s) ). */ - if (data->verbose_level == 0) - { - /* We need to print the data. The next function will only print if - the verbose_level is 1 or more, so I'll fix it at one. Then we print - the final results and exit. */ - data->verbose_level=1; - data->display = Z_EVEN_SINGLE_DIELECTRIC; - print_data_for_directional_couplers(*data, where_to_print_fp, inputfile_filename); - } - } /* end of if couplers */ -}