execute .exe in subdirectories?
    3 views (last 30 days)
  
       Show older comments
    
Hi, 
The .exe I am using doesn't work well when calling files outside its current working directory.  So I have copied the .exe to each of the subdirectories (ie mote carlo iterations). However, my code as written is, I think, using the original .exe, and not running the copies in each path{i}. The exe defaults to looking in its current working directory for the files it needs.
How would I re-script the bottom segment of code so that I am running the copies of the .exe in each path{i} ? 
clear all;
clc;
%Solute transport parameters in row 47 of SELECTOR.IN file
SolTrans=[0.035 0 1 0.0479 0 0 0 0 273895 1 0 0 0 0]; %[Kd Nu Beta Henry SnkL1 SnkS1 SnkG1 SnkL1p SnkS1p SnkG1p SnkL10 SnkS10 SnkG10 Alfa] !! UPDATE NUMBERS IN BRACKETS !!
%~~~~~~
%ADD NOISE TO SOLUTE TRANSPORT PARAMETERS 
num_sim=100;    %100 Monte Carlo Simulations
Kd=SolTrans(1)+.02*rand(1,num_sim); %a vector with 100 values of Kd parameters. We assume that the error is normally distributed with a standard deviation of ##.
Nu=SolTrans(2)+.02*rand(1,num_sim);
Beta=SolTrans(3)+.02*rand(1,num_sim);      %!!! CHANGE .02 FOR ALL THESE TO APPROPRIATE STANDARD DEVIATIONSN !!!
Henry=SolTrans(4)+.02*rand(1,num_sim);
SnkL1=SolTrans(5); 
SnkS1=SolTrans(6);
SnkG1=SolTrans(7);
SnkL1p=SolTrans(8);
SnkS1p=SolTrans(9)+.02*rand(1,num_sim);      %!!! FOR AWI MODIFIED MODEL - KL - LANGMUIR EXPONENT FOR AWI FOR LANGMUIR SORPTION or 0 FOR FREUNDLICH SORPTION
SnkG1p=SolTrans(10);
SnkL10=SolTrans(11);
SnkS10=SolTrans(12);
SnkG10=SolTrans(13);
Alfa=SolTrans(14);
%~~~~~~
%INITIALIZE FILES AND DIRECTORIES
hydrus_exec='C:\Users\jessi\Desktop\Hydrus\Projects\ATSDR\AFFF1PFOS\H1D_CALC.exe';   
hydrus_ref='C:\Users\jessi\Desktop\Hydrus\Projects\ATSDR\AFFF1PFOS';   
profileDAT='C:\Users\jessi\Desktop\Hydrus\Projects\ATSDR\AFFF1PFOS\PROFILE.DAT';    
options='C:\Users\jessi\Desktop\Hydrus\Projects\ATSDR\AFFF1PFOS\OPTIONS.IN';
atmosph='C:\Users\jessi\Desktop\Hydrus\Projects\ATSDR\AFFF1PFOS\ATMOSPH.IN';
selectorIN='C:\Users\jessi\Desktop\Hydrus\Projects\ATSDR\AFFF1PFOS\SELECTOR.IN';  
level='C:\Users\jessi\Desktop\Hydrus\Projects\ATSDR\AFFF1PFOS\LEVEL_01.dir';
work_dir='C:\Users\jessi\Desktop\Simulations\';
mkdir(work_dir);
%~~~~~~
%CREATE DIRECTORIES AND INPUT FILES - This block is doing the work. Creates the input files for all realizations. Copies the mandatory file Profile.dat to 
% the corresponding folder and creates the corresponding Selector
% .in. The Selector.in file is different for each realization since the solute transport parameters is 
% variable. The code reads the reference Selector.in, copies the first 46 lines to the new file, write the van Genuchten parameters to the 47th line, 
% and finally copies the last 10 lines from the reference Selector.in to the new file.
path=cell(1,num_sim);
for i=1:num_sim
    path{i}=strcat(work_dir,'run_',num2str(i)); %create folder for each run           
    mkdir(path{i});    
    copyfile(profileDAT,path{i}); %copy profileDAt from reference directory to the simulation directory 
    copyfile(options,path{i}); %copy options from reference directory to the simulation directory 
    copyfile(atmosph,path{i}); %copy atmosph from reference directory to the simulation director
    copyfile(hydrus_exec,path{i}); %copy options from reference directory to the simulation directory 
    %created appropriate level_01.dir file in each path{i} that calls the path{i} working directory
    fid_level = fopen(fullfile(path{i},'LEVEL_01.dir'),'w');
    fprintf(fid_level,'%s',path{i});
    fclose(fid_level);
    %creates a new selector.in file for eacvh path{i} that has different
    %solute transport parameters based on monte carlo
    fileID_out=fopen(strcat(path{i},'\selector.in'),'wt'); %manipulate Selector.in for each run
                        % "wt"= permision for file axis type
                        % w=Open or create new file for writing. Discard existing contents, if any.
                       % To open files in text mode, attach the letter 't' to the permission argument,
    fileID_in=fopen(selectorIN);
    skip_lines=46;      %!!! THIS IS THE LINE THAT CHANGES IN SELECTOR.IN FILE , i.e. solute transport parameters!!!
    for k=1:(skip_lines)
        x=fgetl(fileID_in); %x = fgetl(fileID)= returns the next line of the specified file, removing the newline characters.
        fprintf(fileID_out,'%s\n',x);  % %s in the formatSpec input indicates that the values of the variables url and sitename, should be printed as text. 
                                       % '\n' as a newline indicator.   
                                       % "x" = prints the values from variable x
    end
    out_Sol=SolTrans; % Renaming...
    %Whatever the solute transport parameter is for that monte carlo run (i)
    out_Sol(1)=Kd(i);       % Solid phase sorption Kd
    out_Sol(2)=Nu(i);       % Van Genuchten parameter
    out_Sol(3)=Beta(i);     % Van Genuchten parameter
    out_Sol(4)=Henry(i);     % Kh = KL*Rmax
    out_Sol(9)=SnkS1p(i);    % KL - LANGMUIR EXPONENT FOR AWI FOR LANGMUIR SORPTION or 0 FOR FREUNDLICH SORPTION
    fprintf(fileID_out,'%f %f %f %f %f %f %f %f %f %f %f %f %f %f\n',out_Sol'); 
                             % %f = Fixed-point notation (Use a precision operator to specify the number of digits after the decimal point.)
                             % '\n' as a newline indicator. 
    fgetl(fileID_in);        % returns the next line of the specified file, removing the newline characters.
    skip_lines_end=5;       % CORRECT NUMBER???  DOUBLE CHECK
    for k=1:(skip_lines_end)
        x=fgetl(fileID_in);
        fprintf(fileID_out,'%s\n',x);
    end
    fclose('all');
end
%SECTION THAT NEEDS WORK...I THINK CODE AS WRITTEN IS CALLING ORIGINAL
%.EXE, BUT i WOULD LIKE THE .EXE COPIES IN EACH PATH{i} TO EXECUTE AND CALL
%THEIR RESPECTIVE PATH{i} FILES. HOW SHOULD I CANGE THIS SECTION TO DO
%THAT?
for i=1:num_sim
    exec_path=['"' hydrus_exec '" "' path{i} '"'];
    [x, y]= dos(exec_path);
    if x % unsuccessful
         error('exe failed'); % or take some other action besides throwing an error
    end
end
Many thanks!!!
7 Comments
  Jan
      
      
 on 13 Jul 2022
				By the way, avoid using "path" as name of a variable, because it is a fundamental Matlab command. This could cause very strange side-effects during debugging.
Avoid strcat to create path names of files, because fullfile is safer.
clear all is not useful. Store code in functions instead, to keep the workspace clean.
It is very unlikely, that an executable needs to exist in the same folder as its data. If this is really the case and you cannot provide the data as input argument, the exectuble follows a bad programming practice. I'd avoid to perform productive work with it. But read the documentation again, if there is a method to provide the data path.
Accepted Answer
  Voss
      
      
 on 13 Jul 2022
        To call each copy of the .exe, with no input arguments to the .exe (may work - who knows, worth a shot):
for i=1:num_sim
    exec_path=['"' fullfile(path{i},'H1D_CALC.exe') '"'];
    [x, y]= dos(exec_path);
    if x % unsuccessful
         error('exe failed'); % or take some other action besides throwing an error
    end
end
To call each copy of the .exe with one input argument, which is the name of the directory it resides in (same as you were doing before with a single .exe, except now the .exe you're running is in that same directory each time):
for i=1:num_sim
    exec_path=['"' fullfile(path{i},'H1D_CALC.exe') '" "' path{i} '"'];
    [x, y]= dos(exec_path);
    if x % unsuccessful
         error('exe failed'); % or take some other action besides throwing an error
    end
end
More Answers (0)
See Also
Categories
				Find more on Variables in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



