"; start_table(); row2("Structure file", ""); row2("Command file", ""); row2("Command-line file", ""); row2("", ""); end_table(); echo ""; page_tail(); } // verify that an input file exists in sandbox, and return its physical path // function get_file_path($user, $name) { $fname = get_str($name); // verify that the files exist in sandbox // $sbdir = sandbox_dir($user); list($error, $size, $md5) = sandbox_parse_link_file("$sbdir/$fname"); if ($error) error_page("no $name file"); return sandbox_physical_path($user, $md5); } function project_flops() { $x = BoincUser::sum("expavg_credit"); if ($x == 0) $x = 200; $y = 1e9*$x/200; return $y; } function prepare_batch($user) { $structure_file_path = get_file_path($user, 'structure_file'); $command_file_path = get_file_path($user, 'command_file'); $cmdline_file_path = get_file_path($user, 'cmdline_file'); $info = null; $info->structure_file_path = $structure_file_path; $info->command_file_path = $command_file_path; $info->cmdline_file_path = $cmdline_file_path; // get FLOPS per job // TODO // $info->rsc_fpops_est = 1e12; // get disk space per job // TODO $info->rsc_disk_bound = 1e8; $tmpfile = tempnam("/tmp", "lammps_"); file_put_contents($tmpfile, serialize($info)); // get the # of jobs // $njobs = count(file($cmdline_file_path)); $total_flops = $njobs * $info->rsc_fpops_est; $secs_est = $total_flops/project_flops(); $hrs_est = number_format($secs_est/3600, 1); $client_mb = $info->rsc_disk_bound/1e6; $server_mb = $njobs*$client_mb; page_head("Batch prepared"); echo " Your batch has $njobs jobs.

Estimated time to completion: $hrs_est hours.

Estimated client disk usage: $client_mb MB

Estimated server disk usage: $server_mb MB

"; show_button("lammps.php?action=submit&tmpfile=$tmpfile", "Submit Batch"); page_tail(); } function submit_job($app, $batch_id, $info, $cmdline, $i) { $cmd = "cd ../..; ./bin/create_work --appname $app->name --batch $batch_id --rsc_fpops_est $info->rsc_fpops_est"; if ($cmdline) { $cmd .= " --command_line \"$cmdline\""; } $cmd .= " --wu_name batch_".$batch_id."_".$i; $cmd .= " $info->structure_file_path"; $cmd .= " $info->command_file_path"; echo "
$cmd\n"; return; $ret = system($cmd); if ($ret === FALSE) { error_page("can't create job"); } } function submit_batch($user, $app) { $tmpfile = get_str('tmpfile'); $x = file_get_contents("$tmpfile"); $info = unserialize($x); $cmdlines = file($info->cmdline_file_path); $njobs = count($cmdlines); $now = time(); $batch_name = time_str($now); // $batch_id = BoincBatch::insert( // "(user_id, create_time, njobs, name, app_id) values ($user->id, $now, $njobs, '$batch_name', $app->id)" // ); $batch_id=99; $i = 0; foreach ($cmdlines as $cmdline) { submit_job($app, $batch_id, $info, $cmdline, $i); $i++; } } $user = get_logged_in_user(); $user_submit = BoincUserSubmit::lookup_userid($user->id); if (!$user_submit) error_page("no submit access"); $app = BoincApp::lookup("name='lammps'"); if (!$app) error_page("no lammps app"); if (!$user_submit->submit_all) { $usa = BoincUserSubmitApp::lookup("user_id=$user->id and app_id=$app->id"); if (!$usa) { error_page("no submit access"); } } $action = get_str('action', true); switch ($action) { case '': show_submit_form(); break; case 'prepare': prepare_batch($user); break; case 'submit': submit_batch($user, $app); break; default: error_page("no such action $action"); } ?>